From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vitaly Kuznetsov Subject: [PATCH 3/5] x86/xen: put setup.c, mmu.c and p2m.c under CONFIG_XEN_PV Date: Fri, 24 Feb 2017 17:14:38 +0100 Message-ID: <20170224161440.2136-4-vkuznets@redhat.com> References: <20170224161440.2136-1-vkuznets@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1chIWC-0005RL-Qs for xen-devel@lists.xenproject.org; Fri, 24 Feb 2017 16:14:53 +0000 In-Reply-To: <20170224161440.2136-1-vkuznets@redhat.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Boris Ostrovsky , x86@kernel.org, Andrew Jones , linux-kernel@vger.kernel.org List-Id: xen-devel@lists.xenproject.org VGhlc2UgdGhyZWUgZmlsZXMgKG1tdS5jLCBwMm0uYywgc2V0dXAuYykgYXJlIG1vc3RseSByZXF1 aXJlZCB0byBzdXBwb3J0ClBWIGd1ZXN0cywgaW4gZmFjdCBwMm0uYyBhbmQgc2V0dXAuYyBoYXZl IG5vIGNvZGUgZm9yIFBWSFZNIGF0IGFsbC4gbW11LmMKaGFzIHNvbWUsIHNwbGl0IHRoZSBmaWxl IGludG8gbW11LmMsIG1tdV9wdi5jIGFuZCBtbXVfaHZtLmMuCgpTb21lIGFkZGl0aW9uYWwgY2hh bmdlcyBhcmUgcmVxdWlyZWQ6Ci0gSW4gdGhlIGJhbGxvb24gZHJpdmVyIHdlIGNhbid0IHVzZSB4 ZW5fc3RhcnRfaW5mbywgeGVuX3JlbGVhc2VkX3BhZ2VzCiAgYW5kIHhlbl9leHRyYV9tZW0gaXQg aXMgUFYtb25seS4gRGVjb3JhdGUgaXQgd2l0aCAjaWZkZWYgQ09ORklHX1hFTl9QVgoKLSBTb21l IFBWLW9ubHkgZnVuY3Rpb25zIGFyZSB1c2VkIGJ5IGRyaXZlcnMgYW5kIGZvciBQVkhWTSBndWVz dHMgdGhlc2UKICBmdW5jdGlvbnMgaGF2ZSAnaWYgKHhlbl9mZWF0dXJlKFhFTkZFQVRfYXV0b190 cmFuc2xhdGVkX3BoeXNtYXApKScgY2hlY2sKICBpbiB0aGUgYmVnaW5uaW5nLiBDcmVhdGUgcmVx dWlyZWQgc3R1YnMgZm9yIFBWSFZNLW9ubHkgYnVpbGRzLgoKU2lnbmVkLW9mZi1ieTogVml0YWx5 IEt1em5ldHNvdiA8dmt1em5ldHNAcmVkaGF0LmNvbT4KLS0tCiBhcmNoL3g4Ni9pbmNsdWRlL2Fz bS94ZW4vcGFnZS5oIHwgICA0NCArLQogYXJjaC94ODYveGVuL01ha2VmaWxlICAgICAgICAgICB8 ICAgMTIgKy0KIGFyY2gveDg2L3hlbi9tbXUuYyAgICAgICAgICAgICAgfCAyNzc4ICstLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogYXJjaC94ODYveGVuL21tdV9odm0uYyAg ICAgICAgICB8ICAgNzcgKysKIGFyY2gveDg2L3hlbi9tbXVfcHYuYyAgICAgICAgICAgfCAyNjM2 ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMveGVuL2JhbGxv b24uYyAgICAgICAgICAgfCAgIDMwICstCiBpbmNsdWRlL3hlbi94ZW4tb3BzLmggICAgICAgICAg IHwgICAxMyArCiA3IGZpbGVzIGNoYW5nZWQsIDI4MzEgaW5zZXJ0aW9ucygrKSwgMjc1OSBkZWxl dGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBhcmNoL3g4Ni94ZW4vbW11X2h2bS5jCiBjcmVh dGUgbW9kZSAxMDA2NDQgYXJjaC94ODYveGVuL21tdV9wdi5jCgpkaWZmIC0tZ2l0IGEvYXJjaC94 ODYvaW5jbHVkZS9hc20veGVuL3BhZ2UuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9wYWdl LmgKaW5kZXggMzNjYmQzZC4uYzhhMzQ3ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9h c20veGVuL3BhZ2UuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vcGFnZS5oCkBAIC00 Myw5ICs0MywxMCBAQCBleHRlcm4gdW5zaWduZWQgbG9uZyAqeGVuX3AybV9hZGRyOwogZXh0ZXJu IHVuc2lnbmVkIGxvbmcgIHhlbl9wMm1fc2l6ZTsKIGV4dGVybiB1bnNpZ25lZCBsb25nICB4ZW5f bWF4X3AybV9wZm47CiAKLWV4dGVybiBpbnQgeGVuX2FsbG9jX3AybV9lbnRyeSh1bnNpZ25lZCBs b25nIHBmbik7Ci0KIGV4dGVybiB1bnNpZ25lZCBsb25nIGdldF9waHlzX3RvX21hY2hpbmUodW5z aWduZWQgbG9uZyBwZm4pOworCisjaWZkZWYgQ09ORklHX1hFTl9QVgorZXh0ZXJuIGludCB4ZW5f YWxsb2NfcDJtX2VudHJ5KHVuc2lnbmVkIGxvbmcgcGZuKTsKIGV4dGVybiBib29sIHNldF9waHlz X3RvX21hY2hpbmUodW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbWZuKTsKIGV4dGVy biBib29sIF9fc2V0X3BoeXNfdG9fbWFjaGluZSh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQg bG9uZyBtZm4pOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19pbml0IHNldF9waHlzX3JhbmdlX2lk ZW50aXR5KHVuc2lnbmVkIGxvbmcgcGZuX3MsCkBAIC01Nyw2ICs1OCwzOCBAQCBleHRlcm4gaW50 IHNldF9mb3JlaWduX3AybV9tYXBwaW5nKHN0cnVjdCBnbnR0YWJfbWFwX2dyYW50X3JlZiAqbWFw X29wcywKIGV4dGVybiBpbnQgY2xlYXJfZm9yZWlnbl9wMm1fbWFwcGluZyhzdHJ1Y3QgZ250dGFi X3VubWFwX2dyYW50X3JlZiAqdW5tYXBfb3BzLAogCQkJCSAgICAgc3RydWN0IGdudHRhYl91bm1h cF9ncmFudF9yZWYgKmt1bm1hcF9vcHMsCiAJCQkJICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1 bnNpZ25lZCBpbnQgY291bnQpOworI2Vsc2UgLyogQ09ORklHX1hFTl9QViAqLworc3RhdGljIGlu bGluZSBpbnQgeGVuX2FsbG9jX3AybV9lbnRyeSh1bnNpZ25lZCBsb25nIHBmbikKK3sKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGlubGluZSBib29sIHNldF9waHlzX3RvX21hY2hpbmUodW5zaWdu ZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbWZuKQoreworCXJldHVybiB0cnVlOworfQorCitz dGF0aWMgaW5saW5lIGJvb2wgX19zZXRfcGh5c190b19tYWNoaW5lKHVuc2lnbmVkIGxvbmcgcGZu LCB1bnNpZ25lZCBsb25nIG1mbikKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGlubGlu ZSBpbnQKK3NldF9mb3JlaWduX3AybV9tYXBwaW5nKHN0cnVjdCBnbnR0YWJfbWFwX2dyYW50X3Jl ZiAqbWFwX29wcywKKwkJCXN0cnVjdCBnbnR0YWJfbWFwX2dyYW50X3JlZiAqa21hcF9vcHMsCisJ CQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitjbGVhcl9mb3JlaWduX3AybV9tYXBwaW5nKHN0cnVj dCBnbnR0YWJfdW5tYXBfZ3JhbnRfcmVmICp1bm1hcF9vcHMsCisJCQkgIHN0cnVjdCBnbnR0YWJf dW5tYXBfZ3JhbnRfcmVmICprdW5tYXBfb3BzLAorCQkJICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1 bnNpZ25lZCBpbnQgY291bnQpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1hF Tl9QViAqLwogCiAvKgogICogSGVscGVyIGZ1bmN0aW9ucyB0byB3cml0ZSBvciByZWFkIHVuc2ln bmVkIGxvbmcgdmFsdWVzIHRvL2Zyb20KQEAgLTgyLDYgKzExNSw3IEBAIHN0YXRpYyBpbmxpbmUg aW50IHhlbl9zYWZlX3JlYWRfdWxvbmcodW5zaWduZWQgbG9uZyAqYWRkciwgdW5zaWduZWQgbG9u ZyAqdmFsKQogICogLSBnZXRfcGh5c190b19tYWNoaW5lKCkgaXMgdG8gYmUgY2FsbGVkIGJ5IF9f cGZuX3RvX21mbigpIG9ubHkgaW4gc3BlY2lhbAogICogICBjYXNlcyBuZWVkaW5nIGFuIGV4dGVu ZGVkIGhhbmRsaW5nLgogICovCisjaWZkZWYgQ09ORklHX1hFTl9QVgogc3RhdGljIGlubGluZSB1 bnNpZ25lZCBsb25nIF9fcGZuX3RvX21mbih1bnNpZ25lZCBsb25nIHBmbikKIHsKIAl1bnNpZ25l ZCBsb25nIG1mbjsKQEAgLTk4LDYgKzEzMiwxMiBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxv bmcgX19wZm5fdG9fbWZuKHVuc2lnbmVkIGxvbmcgcGZuKQogCiAJcmV0dXJuIG1mbjsKIH0KKyNl bHNlCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19wZm5fdG9fbWZuKHVuc2lnbmVkIGxv bmcgcGZuKQoreworCXJldHVybiBwZm47Cit9CisjZW5kaWYKIAogc3RhdGljIGlubGluZSB1bnNp Z25lZCBsb25nIHBmbl90b19tZm4odW5zaWduZWQgbG9uZyBwZm4pCiB7CmRpZmYgLS1naXQgYS9h cmNoL3g4Ni94ZW4vTWFrZWZpbGUgYi9hcmNoL3g4Ni94ZW4vTWFrZWZpbGUKaW5kZXggZWQ2ZjEy Ni4uM2JmODQwZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL01ha2VmaWxlCisrKyBiL2FyY2gv eDg2L3hlbi9NYWtlZmlsZQpAQCAtOCwxNSArOCwxNSBAQCBlbmRpZgogIyBNYWtlIHN1cmUgZWFy bHkgYm9vdCBoYXMgbm8gc3RhY2twcm90ZWN0b3IKIG5vc3RhY2twIDo9ICQoY2FsbCBjYy1vcHRp b24sIC1mbm8tc3RhY2stcHJvdGVjdG9yKQogQ0ZMQUdTX2VubGlnaHRlbl9wdi5vCQk6PSAkKG5v c3RhY2twKQotQ0ZMQUdTX21tdS5vCQkJOj0gJChub3N0YWNrcCkKK0NGTEFHU19tbXVfcHYubwkJ CTo9ICQobm9zdGFja3ApCiAKLW9iai15CQk6PSBlbmxpZ2h0ZW4ubyBzZXR1cC5vIG11bHRpY2Fs bHMubyBcCi0JCQltbXUubyBpcnEubyB0aW1lLm8geGVuLWFzbS5vIHhlbi1hc21fJChCSVRTKS5v IFwKK29iai15CQk6PSBlbmxpZ2h0ZW4ubyBtdWx0aWNhbGxzLm8gXAorCQkJaXJxLm8gdGltZS5v IHhlbi1hc20ubyB4ZW4tYXNtXyQoQklUUykubyBcCiAJCQlncmFudC10YWJsZS5vIHN1c3BlbmQu byBwbGF0Zm9ybS1wY2ktdW5wbHVnLm8gXAotCQkJcDJtLm8gYXBpYy5vIHBtdS5vCisJCQlhcGlj Lm8gcG11Lm8gbW11Lm8KIAotb2JqLSQoQ09ORklHX1hFTl9QVikJCSs9IGVubGlnaHRlbl9wdi5v Ci1vYmotJChDT05GSUdfWEVOX1BWSFZNKQkJKz0gZW5saWdodGVuX2h2bS5vCitvYmotJChDT05G SUdfWEVOX1BWKQkJKz0gZW5saWdodGVuX3B2Lm8gc2V0dXAubyBtbXVfcHYubyBwMm0ubworb2Jq LSQoQ09ORklHX1hFTl9QVkhWTSkJCSs9IGVubGlnaHRlbl9odm0ubyBtbXVfaHZtLm8KIG9iai0k KENPTkZJR19YRU5fUFZIKQkJKz0gZW5saWdodGVuX3B2aC5vCiAKIG9iai0kKENPTkZJR19FVkVO VF9UUkFDSU5HKSArPSB0cmFjZS5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vbW11LmMgYi9h cmNoL3g4Ni94ZW4vbW11LmMKaW5kZXggODgxYmFhYy4uNWUzNzVhNSAxMDA2NDQKLS0tIGEvYXJj aC94ODYveGVuL21tdS5jCisrKyBiL2FyY2gveDg2L3hlbi9tbXUuYwpAQCAtMSwyNzY5ICsxLDY2 IEBACi0vKgotICogWGVuIG1tdSBvcGVyYXRpb25zCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5z IHRoZSB2YXJpb3VzIG1tdSBmZXRjaCBhbmQgdXBkYXRlIG9wZXJhdGlvbnMuCi0gKiBUaGUgbW9z dCBpbXBvcnRhbnQgam9iIHRoZXkgbXVzdCBwZXJmb3JtIGlzIHRoZSBtYXBwaW5nIGJldHdlZW4g dGhlCi0gKiBkb21haW4ncyBwZm4gYW5kIHRoZSBvdmVyYWxsIG1hY2hpbmUgbWZucy4KLSAqCi0g KiBYZW4gYWxsb3dzIGd1ZXN0cyB0byBkaXJlY3RseSB1cGRhdGUgdGhlIHBhZ2V0YWJsZSwgaW4g YSBjb250cm9sbGVkCi0gKiBmYXNoaW9uLiAgSW4gb3RoZXIgd29yZHMsIHRoZSBndWVzdCBtb2Rp ZmllcyB0aGUgc2FtZSBwYWdldGFibGUKLSAqIHRoYXQgdGhlIENQVSBhY3R1YWxseSB1c2VzLCB3 aGljaCBlbGltaW5hdGVzIHRoZSBvdmVyaGVhZCBvZiBoYXZpbmcKLSAqIGEgc2VwYXJhdGUgc2hh ZG93IHBhZ2V0YWJsZS4KLSAqCi0gKiBJbiBvcmRlciB0byBhbGxvdyB0aGlzLCBpdCBmYWxscyBv biB0aGUgZ3Vlc3QgZG9tYWluIHRvIG1hcCBpdHMKLSAqIG5vdGlvbiBvZiBhICJwaHlzaWNhbCIg cGZuIC0gd2hpY2ggaXMganVzdCBhIGRvbWFpbi1sb2NhbCBsaW5lYXIKLSAqIGFkZHJlc3MgLSBp bnRvIGEgcmVhbCAibWFjaGluZSBhZGRyZXNzIiB3aGljaCB0aGUgQ1BVJ3MgTU1VIGNhbgotICog dXNlLgotICoKLSAqIEEgcGdkX3QvcG1kX3QvcHRlX3Qgd2lsbCB0eXBpY2FsbHkgY29udGFpbiBh biBtZm4sIGFuZCBzbyBjYW4gYmUKLSAqIGluc2VydGVkIGRpcmVjdGx5IGludG8gdGhlIHBhZ2V0 YWJsZS4gIFdoZW4gY3JlYXRpbmcgYSBuZXcKLSAqIHB0ZS9wbWQvcGdkLCBpdCBjb252ZXJ0cyB0 aGUgcGFzc2VkIHBmbiBpbnRvIGFuIG1mbi4gIENvbnZlcnNlbHksCi0gKiB3aGVuIHJlYWRpbmcg dGhlIGNvbnRlbnQgYmFjayB3aXRoIF9fKHBnZHxwbWR8cHRlKV92YWwsIGl0IGNvbnZlcnRzCi0g KiB0aGUgbWZuIGJhY2sgaW50byBhIHBmbi4KLSAqCi0gKiBUaGUgb3RoZXIgY29uc3RyYWludCBp cyB0aGF0IGFsbCBwYWdlcyB3aGljaCBtYWtlIHVwIGEgcGFnZXRhYmxlCi0gKiBtdXN0IGJlIG1h cHBlZCByZWFkLW9ubHkgaW4gdGhlIGd1ZXN0LiAgVGhpcyBwcmV2ZW50cyB1bmNvbnRyb2xsZWQK LSAqIGd1ZXN0IHVwZGF0ZXMgdG8gdGhlIHBhZ2V0YWJsZS4gIFhlbiBzdHJpY3RseSBlbmZvcmNl cyB0aGlzLCBhbmQKLSAqIHdpbGwgZGlzYWxsb3cgYW55IHBhZ2V0YWJsZSB1cGRhdGUgd2hpY2gg d2lsbCBlbmQgdXAgbWFwcGluZyBhCi0gKiBwYWdldGFibGUgcGFnZSBSVywgYW5kIHdpbGwgZGlz YWxsb3cgdXNpbmcgYW55IHdyaXRhYmxlIHBhZ2UgYXMgYQotICogcGFnZXRhYmxlLgotICoKLSAq IE5haXZlbHksIHdoZW4gbG9hZGluZyAlY3IzIHdpdGggdGhlIGJhc2Ugb2YgYSBuZXcgcGFnZXRh YmxlLCBYZW4KLSAqIHdvdWxkIG5lZWQgdG8gdmFsaWRhdGUgdGhlIHdob2xlIHBhZ2V0YWJsZSBi ZWZvcmUgZ29pbmcgb24uCi0gKiBOYXR1cmFsbHksIHRoaXMgaXMgcXVpdGUgc2xvdy4gIFRoZSBz b2x1dGlvbiBpcyB0byAicGluIiBhCi0gKiBwYWdldGFibGUsIHdoaWNoIGVuZm9yY2VzIGFsbCB0 aGUgY29uc3RyYWludHMgb24gdGhlIHBhZ2V0YWJsZSBldmVuCi0gKiB3aGVuIGl0IGlzIG5vdCBh Y3RpdmVseSBpbiB1c2UuICBUaGlzIG1lbmFzIHRoYXQgWGVuIGNhbiBiZSBhc3N1cmVkCi0gKiB0 aGF0IGl0IGlzIHN0aWxsIHZhbGlkIHdoZW4geW91IGRvIGxvYWQgaXQgaW50byAlY3IzLCBhbmQg ZG9lc24ndAotICogbmVlZCB0byByZXZhbGlkYXRlIGl0LgotICoKLSAqIEplcmVteSBGaXR6aGFy ZGluZ2UgPGplcmVteUB4ZW5zb3VyY2UuY29tPiwgWGVuU291cmNlIEluYywgMjAwNwotICovCi0j aW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+Ci0jaW5j bHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgotI2luY2x1ZGUg PGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KLSNpbmNsdWRlIDxs aW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ2ZwLmg+Ci0jaW5jbHVkZSA8bGludXgvbWVt YmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Ny YXNoX2R1bXAuaD4KLQotI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy94ZW4uaD4KLQotI2luY2x1ZGUg PGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+Ci0jaW5jbHVkZSA8YXNt L2ZpeG1hcC5oPgotI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgotI2luY2x1ZGUgPGFzbS9z ZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9wYXJhdmlydC5oPgotI2luY2x1ZGUgPGFzbS9lODIwLmg+ Ci0jaW5jbHVkZSA8YXNtL2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1 ZGUgPGFzbS9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL3BhdC5oPgotI2luY2x1ZGUgPGFzbS9zbXAu aD4KLQotI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJjYWxsLmg+Ci0jaW5jbHVkZSA8YXNtL3hlbi9o eXBlcnZpc29yLmg+Ci0KLSNpbmNsdWRlIDx4ZW4veGVuLmg+Ci0jaW5jbHVkZSA8eGVuL3BhZ2Uu aD4KLSNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3hlbi5oPgotI2luY2x1ZGUgPHhlbi9pbnRlcmZh Y2UvaHZtL2h2bV9vcC5oPgotI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvdmVyc2lvbi5oPgotI2lu Y2x1ZGUgPHhlbi9pbnRlcmZhY2UvbWVtb3J5Lmg+Ci0jaW5jbHVkZSA8eGVuL2h2Yy1jb25zb2xl Lmg+Ci0KLSNpbmNsdWRlICJtdWx0aWNhbGxzLmgiCi0jaW5jbHVkZSAibW11LmgiCi0jaW5jbHVk ZSAiZGVidWdmcy5oIgotCi0vKgotICogUHJvdGVjdHMgYXRvbWljIHJlc2VydmF0aW9uIGRlY3Jl YXNlL2luY3JlYXNlIGFnYWluc3QgY29uY3VycmVudCBpbmNyZWFzZXMuCi0gKiBBbHNvIHByb3Rl Y3RzIG5vbi1hdG9taWMgdXBkYXRlcyBvZiBjdXJyZW50X3BhZ2VzIGFuZCBiYWxsb29uIGxpc3Rz LgotICovCi1ERUZJTkVfU1BJTkxPQ0soeGVuX3Jlc2VydmF0aW9uX2xvY2spOwotCi0jaWZkZWYg Q09ORklHX1g4Nl8zMgotLyoKLSAqIElkZW50aXR5IG1hcCwgaW4gYWRkaXRpb24gdG8gcGxhaW4g a2VybmVsIG1hcC4gIFRoaXMgbmVlZHMgdG8gYmUKLSAqIGxhcmdlIGVub3VnaCB0byBhbGxvY2F0 ZSBwYWdlIHRhYmxlIHBhZ2VzIHRvIGFsbG9jYXRlIHRoZSByZXN0LgotICogRWFjaCBwYWdlIGNh biBtYXAgMk1CLgotICovCi0jZGVmaW5lIExFVkVMMV9JREVOVF9FTlRSSUVTCShQVFJTX1BFUl9Q VEUgKiA0KQotc3RhdGljIFJFU0VSVkVfQlJLX0FSUkFZKHB0ZV90LCBsZXZlbDFfaWRlbnRfcGd0 LCBMRVZFTDFfSURFTlRfRU5UUklFUyk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0v KiBsMyBwdWQgZm9yIHVzZXJzcGFjZSB2c3lzY2FsbCBtYXBwaW5nICovCi1zdGF0aWMgcHVkX3Qg bGV2ZWwzX3VzZXJfdnN5c2NhbGxbUFRSU19QRVJfUFVEXSBfX3BhZ2VfYWxpZ25lZF9ic3M7Ci0j ZW5kaWYgLyogQ09ORklHX1g4Nl82NCAqLwotCi0vKgotICogTm90ZSBhYm91dCBjcjMgKHBhZ2V0 YWJsZSBiYXNlKSB2YWx1ZXM6Ci0gKgotICogeGVuX2NyMyBjb250YWlucyB0aGUgY3VycmVudCBs b2dpY2FsIGNyMyB2YWx1ZTsgaXQgY29udGFpbnMgdGhlCi0gKiBsYXN0IHNldCBjcjMuICBUaGlz IG1heSBub3QgYmUgdGhlIGN1cnJlbnQgZWZmZWN0aXZlIGNyMywgYmVjYXVzZQotICogaXRzIHVw ZGF0ZSBtYXkgYmUgYmVpbmcgbGF6aWx5IGRlZmVycmVkLiAgSG93ZXZlciwgYSB2Y3B1IGxvb2tp bmcKLSAqIGF0IGl0cyBvd24gY3IzIGNhbiB1c2UgdGhpcyB2YWx1ZSBrbm93aW5nIHRoYXQgaXQg ZXZlcnl0aGluZyB3aWxsCi0gKiBiZSBzZWxmLWNvbnNpc3RlbnQuCi0gKgotICogeGVuX2N1cnJl bnRfY3IzIGNvbnRhaW5zIHRoZSBhY3R1YWwgdmNwdSBjcjM7IGl0IGlzIHNldCBvbmNlIHRoZQot ICogaHlwZXJjYWxsIHRvIHNldCB0aGUgdmNwdSBjcjMgaXMgY29tcGxldGUgKHNvIGl0IG1heSBi ZSBhIGxpdHRsZQotICogb3V0IG9mIGRhdGUsIGJ1dCBpdCB3aWxsIG5ldmVyIGJlIHNldCBlYXJs eSkuICBJZiBvbmUgdmNwdSBpcwotICogbG9va2luZyBhdCBhbm90aGVyIHZjcHUncyBjcjMgdmFs dWUsIGl0IHNob3VsZCB1c2UgdGhpcyB2YXJpYWJsZS4KLSAqLwotREVGSU5FX1BFUl9DUFUodW5z aWduZWQgbG9uZywgeGVuX2NyMyk7CSAvKiBjcjMgc3RvcmVkIGFzIHBoeXNhZGRyICovCi1ERUZJ TkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCB4ZW5fY3VycmVudF9jcjMpOwkgLyogYWN0dWFsIHZj cHUgY3IzICovCi0KLXN0YXRpYyBwaHlzX2FkZHJfdCB4ZW5fcHRfYmFzZSwgeGVuX3B0X3NpemUg X19pbml0ZGF0YTsKLQotLyoKLSAqIEp1c3QgYmV5b25kIHRoZSBoaWdoZXN0IHVzZXJtb2RlIGFk ZHJlc3MuICBTVEFDS19UT1BfTUFYIGhhcyBhCi0gKiByZWR6b25lIGFib3ZlIGl0LCBzbyByb3Vu ZCBpdCB1cCB0byBhIFBHRCBib3VuZGFyeS4KLSAqLwotI2RlZmluZSBVU0VSX0xJTUlUCSgoU1RB Q0tfVE9QX01BWCArIFBHRElSX1NJWkUgLSAxKSAmIFBHRElSX01BU0spCi0KLXVuc2lnbmVkIGxv bmcgYXJiaXRyYXJ5X3ZpcnRfdG9fbWZuKHZvaWQgKnZhZGRyKQotewotCXhtYWRkcl90IG1hZGRy ID0gYXJiaXRyYXJ5X3ZpcnRfdG9fbWFjaGluZSh2YWRkcik7Ci0KLQlyZXR1cm4gUEZOX0RPV04o bWFkZHIubWFkZHIpOwotfQotCi14bWFkZHJfdCBhcmJpdHJhcnlfdmlydF90b19tYWNoaW5lKHZv aWQgKnZhZGRyKQotewotCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKXZh ZGRyOwotCXVuc2lnbmVkIGludCBsZXZlbDsKLQlwdGVfdCAqcHRlOwotCXVuc2lnbmVkIG9mZnNl dDsKLQotCS8qCi0JICogaWYgdGhlIFBGTiBpcyBpbiB0aGUgbGluZWFyIG1hcHBlZCB2YWRkciBy YW5nZSwgd2UgY2FuIGp1c3QgdXNlCi0JICogdGhlIChxdWljaykgdmlydF90b19tYWNoaW5lKCkg cDJtIGxvb2t1cAotCSAqLwotCWlmICh2aXJ0X2FkZHJfdmFsaWQodmFkZHIpKQotCQlyZXR1cm4g dmlydF90b19tYWNoaW5lKHZhZGRyKTsKLQotCS8qIG90aGVyd2lzZSB3ZSBoYXZlIHRvIGRvIGEg KHNsb3dlcikgZnVsbCBwYWdlLXRhYmxlIHdhbGsgKi8KLQotCXB0ZSA9IGxvb2t1cF9hZGRyZXNz KGFkZHJlc3MsICZsZXZlbCk7Ci0JQlVHX09OKHB0ZSA9PSBOVUxMKTsKLQlvZmZzZXQgPSBhZGRy ZXNzICYgflBBR0VfTUFTSzsKLQlyZXR1cm4gWE1BRERSKCgocGh5c19hZGRyX3QpcHRlX21mbigq cHRlKSA8PCBQQUdFX1NISUZUKSArIG9mZnNldCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChhcmJp dHJhcnlfdmlydF90b19tYWNoaW5lKTsKLQotdm9pZCBtYWtlX2xvd21lbV9wYWdlX3JlYWRvbmx5 KHZvaWQgKnZhZGRyKQotewotCXB0ZV90ICpwdGUsIHB0ZXY7Ci0JdW5zaWduZWQgbG9uZyBhZGRy ZXNzID0gKHVuc2lnbmVkIGxvbmcpdmFkZHI7Ci0JdW5zaWduZWQgaW50IGxldmVsOwotCi0JcHRl ID0gbG9va3VwX2FkZHJlc3MoYWRkcmVzcywgJmxldmVsKTsKLQlpZiAocHRlID09IE5VTEwpCi0J CXJldHVybjsJCS8qIHZhZGRyIG1pc3NpbmcgKi8KLQotCXB0ZXYgPSBwdGVfd3Jwcm90ZWN0KCpw dGUpOwotCi0JaWYgKEhZUEVSVklTT1JfdXBkYXRlX3ZhX21hcHBpbmcoYWRkcmVzcywgcHRldiwg MCkpCi0JCUJVRygpOwotfQotCi12b2lkIG1ha2VfbG93bWVtX3BhZ2VfcmVhZHdyaXRlKHZvaWQg KnZhZGRyKQotewotCXB0ZV90ICpwdGUsIHB0ZXY7Ci0JdW5zaWduZWQgbG9uZyBhZGRyZXNzID0g KHVuc2lnbmVkIGxvbmcpdmFkZHI7Ci0JdW5zaWduZWQgaW50IGxldmVsOwotCi0JcHRlID0gbG9v a3VwX2FkZHJlc3MoYWRkcmVzcywgJmxldmVsKTsKLQlpZiAocHRlID09IE5VTEwpCi0JCXJldHVy bjsJCS8qIHZhZGRyIG1pc3NpbmcgKi8KLQotCXB0ZXYgPSBwdGVfbWt3cml0ZSgqcHRlKTsKLQot CWlmIChIWVBFUlZJU09SX3VwZGF0ZV92YV9tYXBwaW5nKGFkZHJlc3MsIHB0ZXYsIDApKQotCQlC VUcoKTsKLX0KLQotCi1zdGF0aWMgYm9vbCB4ZW5fcGFnZV9waW5uZWQodm9pZCAqcHRyKQotewot CXN0cnVjdCBwYWdlICpwYWdlID0gdmlydF90b19wYWdlKHB0cik7Ci0KLQlyZXR1cm4gUGFnZVBp bm5lZChwYWdlKTsKLX0KLQotdm9pZCB4ZW5fc2V0X2RvbWFpbl9wdGUocHRlX3QgKnB0ZXAsIHB0 ZV90IHB0ZXZhbCwgdW5zaWduZWQgZG9taWQpCi17Ci0Jc3RydWN0IG11bHRpY2FsbF9zcGFjZSBt Y3M7Ci0Jc3RydWN0IG1tdV91cGRhdGUgKnU7Ci0KLQl0cmFjZV94ZW5fbW11X3NldF9kb21haW5f cHRlKHB0ZXAsIHB0ZXZhbCwgZG9taWQpOwotCi0JbWNzID0geGVuX21jX2VudHJ5KHNpemVvZigq dSkpOwotCXUgPSBtY3MuYXJnczsKLQotCS8qIHB0ZXAgbWlnaHQgYmUga21hcHBlZCB3aGVuIHVz aW5nIDMyLWJpdCBISUdIUFRFICovCi0JdS0+cHRyID0gdmlydF90b19tYWNoaW5lKHB0ZXApLm1h ZGRyOwotCXUtPnZhbCA9IHB0ZV92YWxfbWEocHRldmFsKTsKLQotCU1VTFRJX21tdV91cGRhdGUo bWNzLm1jLCBtY3MuYXJncywgMSwgTlVMTCwgZG9taWQpOwotCi0JeGVuX21jX2lzc3VlKFBBUkFW SVJUX0xBWllfTU1VKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHhlbl9zZXRfZG9tYWluX3B0ZSk7 Ci0KLXN0YXRpYyB2b2lkIHhlbl9leHRlbmRfbW11X3VwZGF0ZShjb25zdCBzdHJ1Y3QgbW11X3Vw ZGF0ZSAqdXBkYXRlKQotewotCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzOwotCXN0cnVjdCBt bXVfdXBkYXRlICp1OwotCi0JbWNzID0geGVuX21jX2V4dGVuZF9hcmdzKF9fSFlQRVJWSVNPUl9t bXVfdXBkYXRlLCBzaXplb2YoKnUpKTsKLQotCWlmIChtY3MubWMgIT0gTlVMTCkgewotCQltY3Mu bWMtPmFyZ3NbMV0rKzsKLQl9IGVsc2UgewotCQltY3MgPSBfX3hlbl9tY19lbnRyeShzaXplb2Yo KnUpKTsKLQkJTVVMVElfbW11X3VwZGF0ZShtY3MubWMsIG1jcy5hcmdzLCAxLCBOVUxMLCBET01J RF9TRUxGKTsKLQl9Ci0KLQl1ID0gbWNzLmFyZ3M7Ci0JKnUgPSAqdXBkYXRlOwotfQotCi1zdGF0 aWMgdm9pZCB4ZW5fZXh0ZW5kX21tdWV4dF9vcChjb25zdCBzdHJ1Y3QgbW11ZXh0X29wICpvcCkK LXsKLQlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jczsKLQlzdHJ1Y3QgbW11ZXh0X29wICp1Owot Ci0JbWNzID0geGVuX21jX2V4dGVuZF9hcmdzKF9fSFlQRVJWSVNPUl9tbXVleHRfb3AsIHNpemVv ZigqdSkpOwotCi0JaWYgKG1jcy5tYyAhPSBOVUxMKSB7Ci0JCW1jcy5tYy0+YXJnc1sxXSsrOwot CX0gZWxzZSB7Ci0JCW1jcyA9IF9feGVuX21jX2VudHJ5KHNpemVvZigqdSkpOwotCQlNVUxUSV9t bXVleHRfb3AobWNzLm1jLCBtY3MuYXJncywgMSwgTlVMTCwgRE9NSURfU0VMRik7Ci0JfQotCi0J dSA9IG1jcy5hcmdzOwotCSp1ID0gKm9wOwotfQotCi1zdGF0aWMgdm9pZCB4ZW5fc2V0X3BtZF9o eXBlcihwbWRfdCAqcHRyLCBwbWRfdCB2YWwpCi17Ci0Jc3RydWN0IG1tdV91cGRhdGUgdTsKLQot CXByZWVtcHRfZGlzYWJsZSgpOwotCi0JeGVuX21jX2JhdGNoKCk7Ci0KLQkvKiBwdHIgbWF5IGJl IGlvcmVtYXBwZWQgZm9yIDY0LWJpdCBwYWdldGFibGUgc2V0dXAgKi8KLQl1LnB0ciA9IGFyYml0 cmFyeV92aXJ0X3RvX21hY2hpbmUocHRyKS5tYWRkcjsKLQl1LnZhbCA9IHBtZF92YWxfbWEodmFs KTsKLQl4ZW5fZXh0ZW5kX21tdV91cGRhdGUoJnUpOwotCi0JeGVuX21jX2lzc3VlKFBBUkFWSVJU X0xBWllfTU1VKTsKLQotCXByZWVtcHRfZW5hYmxlKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9z ZXRfcG1kKHBtZF90ICpwdHIsIHBtZF90IHZhbCkKLXsKLQl0cmFjZV94ZW5fbW11X3NldF9wbWQo cHRyLCB2YWwpOwotCi0JLyogSWYgcGFnZSBpcyBub3QgcGlubmVkLCB3ZSBjYW4ganVzdCB1cGRh dGUgdGhlIGVudHJ5Ci0JICAgZGlyZWN0bHkgKi8KLQlpZiAoIXhlbl9wYWdlX3Bpbm5lZChwdHIp KSB7Ci0JCSpwdHIgPSB2YWw7Ci0JCXJldHVybjsKLQl9Ci0KLQl4ZW5fc2V0X3BtZF9oeXBlcihw dHIsIHZhbCk7Ci19Ci0KLS8qCi0gKiBBc3NvY2lhdGUgYSB2aXJ0dWFsIHBhZ2UgZnJhbWUgd2l0 aCBhIGdpdmVuIHBoeXNpY2FsIHBhZ2UgZnJhbWUKLSAqIGFuZCBwcm90ZWN0aW9uIGZsYWdzIGZv ciB0aGF0IGZyYW1lLgotICovCi12b2lkIHNldF9wdGVfbWZuKHVuc2lnbmVkIGxvbmcgdmFkZHIs IHVuc2lnbmVkIGxvbmcgbWZuLCBwZ3Byb3RfdCBmbGFncykKLXsKLQlzZXRfcHRlX3ZhZGRyKHZh ZGRyLCBtZm5fcHRlKG1mbiwgZmxhZ3MpKTsKLX0KLQotc3RhdGljIGJvb2wgeGVuX2JhdGNoZWRf c2V0X3B0ZShwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKQotewotCXN0cnVjdCBtbXVfdXBkYXRl IHU7Ci0KLQlpZiAocGFyYXZpcnRfZ2V0X2xhenlfbW9kZSgpICE9IFBBUkFWSVJUX0xBWllfTU1V KQotCQlyZXR1cm4gZmFsc2U7Ci0KLQl4ZW5fbWNfYmF0Y2goKTsKLQotCXUucHRyID0gdmlydF90 b19tYWNoaW5lKHB0ZXApLm1hZGRyIHwgTU1VX05PUk1BTF9QVF9VUERBVEU7Ci0JdS52YWwgPSBw dGVfdmFsX21hKHB0ZXZhbCk7Ci0JeGVuX2V4dGVuZF9tbXVfdXBkYXRlKCZ1KTsKLQotCXhlbl9t Y19pc3N1ZShQQVJBVklSVF9MQVpZX01NVSk7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGlj IGlubGluZSB2b2lkIF9feGVuX3NldF9wdGUocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZXZhbCkKLXsK LQlpZiAoIXhlbl9iYXRjaGVkX3NldF9wdGUocHRlcCwgcHRldmFsKSkgewotCQkvKgotCQkgKiBD b3VsZCBjYWxsIG5hdGl2ZV9zZXRfcHRlKCkgaGVyZSBhbmQgdHJhcCBhbmQKLQkJICogZW11bGF0 ZSB0aGUgUFRFIHdyaXRlIGJ1dCB3aXRoIDMyLWJpdCBndWVzdHMgdGhpcwotCQkgKiBuZWVkcyB0 d28gdHJhcHMgKG9uZSBmb3IgZWFjaCBvZiB0aGUgdHdvIDMyLWJpdAotCQkgKiB3b3JkcyBpbiB0 aGUgUFRFKSBzbyBkbyBvbmUgaHlwZXJjYWxsIGRpcmVjdGx5Ci0JCSAqIGluc3RlYWQuCi0JCSAq LwotCQlzdHJ1Y3QgbW11X3VwZGF0ZSB1OwotCi0JCXUucHRyID0gdmlydF90b19tYWNoaW5lKHB0 ZXApLm1hZGRyIHwgTU1VX05PUk1BTF9QVF9VUERBVEU7Ci0JCXUudmFsID0gcHRlX3ZhbF9tYShw dGV2YWwpOwotCQlIWVBFUlZJU09SX21tdV91cGRhdGUoJnUsIDEsIE5VTEwsIERPTUlEX1NFTEYp OwotCX0KLX0KLQotc3RhdGljIHZvaWQgeGVuX3NldF9wdGUocHRlX3QgKnB0ZXAsIHB0ZV90IHB0 ZXZhbCkKLXsKLQl0cmFjZV94ZW5fbW11X3NldF9wdGUocHRlcCwgcHRldmFsKTsKLQlfX3hlbl9z ZXRfcHRlKHB0ZXAsIHB0ZXZhbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9zZXRfcHRlX2F0KHN0 cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCi0JCSAgICBwdGVfdCAqcHRl cCwgcHRlX3QgcHRldmFsKQotewotCXRyYWNlX3hlbl9tbXVfc2V0X3B0ZV9hdChtbSwgYWRkciwg cHRlcCwgcHRldmFsKTsKLQlfX3hlbl9zZXRfcHRlKHB0ZXAsIHB0ZXZhbCk7Ci19Ci0KLXB0ZV90 IHhlbl9wdGVwX21vZGlmeV9wcm90X3N0YXJ0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAotCQkJCSB1 bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQotewotCS8qIEp1c3QgcmV0dXJuIHRoZSBw dGUgYXMtaXMuICBXZSBwcmVzZXJ2ZSB0aGUgYml0cyBvbiBjb21taXQgKi8KLQl0cmFjZV94ZW5f bW11X3B0ZXBfbW9kaWZ5X3Byb3Rfc3RhcnQobW0sIGFkZHIsIHB0ZXAsICpwdGVwKTsKLQlyZXR1 cm4gKnB0ZXA7Ci19Ci0KLXZvaWQgeGVuX3B0ZXBfbW9kaWZ5X3Byb3RfY29tbWl0KHN0cnVjdCBt bV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCi0JCQkJIHB0ZV90ICpwdGVwLCBwdGVf dCBwdGUpCi17Ci0Jc3RydWN0IG1tdV91cGRhdGUgdTsKLQotCXRyYWNlX3hlbl9tbXVfcHRlcF9t b2RpZnlfcHJvdF9jb21taXQobW0sIGFkZHIsIHB0ZXAsIHB0ZSk7Ci0JeGVuX21jX2JhdGNoKCk7 Ci0KLQl1LnB0ciA9IHZpcnRfdG9fbWFjaGluZShwdGVwKS5tYWRkciB8IE1NVV9QVF9VUERBVEVf UFJFU0VSVkVfQUQ7Ci0JdS52YWwgPSBwdGVfdmFsX21hKHB0ZSk7Ci0JeGVuX2V4dGVuZF9tbXVf dXBkYXRlKCZ1KTsKLQotCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX01NVSk7Ci19Ci0KLS8q IEFzc3VtZSBwdGV2YWxfdCBpcyBlcXVpdmFsZW50IHRvIGFsbCB0aGUgb3RoZXIgKnZhbF90IHR5 cGVzLiAqLwotc3RhdGljIHB0ZXZhbF90IHB0ZV9tZm5fdG9fcGZuKHB0ZXZhbF90IHZhbCkKLXsK LQlpZiAodmFsICYgX1BBR0VfUFJFU0VOVCkgewotCQl1bnNpZ25lZCBsb25nIG1mbiA9ICh2YWwg JiBQVEVfUEZOX01BU0spID4+IFBBR0VfU0hJRlQ7Ci0JCXVuc2lnbmVkIGxvbmcgcGZuID0gbWZu X3RvX3BmbihtZm4pOwotCi0JCXB0ZXZhbF90IGZsYWdzID0gdmFsICYgUFRFX0ZMQUdTX01BU0s7 Ci0JCWlmICh1bmxpa2VseShwZm4gPT0gfjApKQotCQkJdmFsID0gZmxhZ3MgJiB+X1BBR0VfUFJF U0VOVDsKLQkJZWxzZQotCQkJdmFsID0gKChwdGV2YWxfdClwZm4gPDwgUEFHRV9TSElGVCkgfCBm bGFnczsKLQl9Ci0KLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgcHRldmFsX3QgcHRlX3Bmbl90 b19tZm4ocHRldmFsX3QgdmFsKQotewotCWlmICh2YWwgJiBfUEFHRV9QUkVTRU5UKSB7Ci0JCXVu c2lnbmVkIGxvbmcgcGZuID0gKHZhbCAmIFBURV9QRk5fTUFTSykgPj4gUEFHRV9TSElGVDsKLQkJ cHRldmFsX3QgZmxhZ3MgPSB2YWwgJiBQVEVfRkxBR1NfTUFTSzsKLQkJdW5zaWduZWQgbG9uZyBt Zm47Ci0KLQkJaWYgKCF4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFw KSkKLQkJCW1mbiA9IF9fcGZuX3RvX21mbihwZm4pOwotCQllbHNlCi0JCQltZm4gPSBwZm47Ci0J CS8qCi0JCSAqIElmIHRoZXJlJ3Mgbm8gbWZuIGZvciB0aGUgcGZuLCB0aGVuIGp1c3QgY3JlYXRl IGFuCi0JCSAqIGVtcHR5IG5vbi1wcmVzZW50IHB0ZS4gIFVuZm9ydHVuYXRlbHkgdGhpcyBsb3Nl cwotCQkgKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgcGZuLCBzbwotCQkgKiBwdGVf bWZuX3RvX3BmbiBpcyBhc3ltbWV0cmljLgotCQkgKi8KLQkJaWYgKHVubGlrZWx5KG1mbiA9PSBJ TlZBTElEX1AyTV9FTlRSWSkpIHsKLQkJCW1mbiA9IDA7Ci0JCQlmbGFncyA9IDA7Ci0JCX0gZWxz ZQotCQkJbWZuICY9IH4oRk9SRUlHTl9GUkFNRV9CSVQgfCBJREVOVElUWV9GUkFNRV9CSVQpOwot CQl2YWwgPSAoKHB0ZXZhbF90KW1mbiA8PCBQQUdFX1NISUZUKSB8IGZsYWdzOwotCX0KLQotCXJl dHVybiB2YWw7Ci19Ci0KLV9fdmlzaWJsZSBwdGV2YWxfdCB4ZW5fcHRlX3ZhbChwdGVfdCBwdGUp Ci17Ci0JcHRldmFsX3QgcHRldmFsID0gcHRlLnB0ZTsKLQotCXJldHVybiBwdGVfbWZuX3RvX3Bm bihwdGV2YWwpOwotfQotUFZfQ0FMTEVFX1NBVkVfUkVHU19USFVOSyh4ZW5fcHRlX3ZhbCk7Ci0K LV9fdmlzaWJsZSBwZ2R2YWxfdCB4ZW5fcGdkX3ZhbChwZ2RfdCBwZ2QpCi17Ci0JcmV0dXJuIHB0 ZV9tZm5fdG9fcGZuKHBnZC5wZ2QpOwotfQotUFZfQ0FMTEVFX1NBVkVfUkVHU19USFVOSyh4ZW5f cGdkX3ZhbCk7Ci0KLV9fdmlzaWJsZSBwdGVfdCB4ZW5fbWFrZV9wdGUocHRldmFsX3QgcHRlKQot ewotCXB0ZSA9IHB0ZV9wZm5fdG9fbWZuKHB0ZSk7Ci0KLQlyZXR1cm4gbmF0aXZlX21ha2VfcHRl KHB0ZSk7Ci19Ci1QVl9DQUxMRUVfU0FWRV9SRUdTX1RIVU5LKHhlbl9tYWtlX3B0ZSk7Ci0KLV9f dmlzaWJsZSBwZ2RfdCB4ZW5fbWFrZV9wZ2QocGdkdmFsX3QgcGdkKQotewotCXBnZCA9IHB0ZV9w Zm5fdG9fbWZuKHBnZCk7Ci0JcmV0dXJuIG5hdGl2ZV9tYWtlX3BnZChwZ2QpOwotfQotUFZfQ0FM TEVFX1NBVkVfUkVHU19USFVOSyh4ZW5fbWFrZV9wZ2QpOwotCi1fX3Zpc2libGUgcG1kdmFsX3Qg eGVuX3BtZF92YWwocG1kX3QgcG1kKQotewotCXJldHVybiBwdGVfbWZuX3RvX3BmbihwbWQucG1k KTsKLX0KLVBWX0NBTExFRV9TQVZFX1JFR1NfVEhVTksoeGVuX3BtZF92YWwpOwotCi1zdGF0aWMg dm9pZCB4ZW5fc2V0X3B1ZF9oeXBlcihwdWRfdCAqcHRyLCBwdWRfdCB2YWwpCi17Ci0Jc3RydWN0 IG1tdV91cGRhdGUgdTsKLQotCXByZWVtcHRfZGlzYWJsZSgpOwotCi0JeGVuX21jX2JhdGNoKCk7 Ci0KLQkvKiBwdHIgbWF5IGJlIGlvcmVtYXBwZWQgZm9yIDY0LWJpdCBwYWdldGFibGUgc2V0dXAg Ki8KLQl1LnB0ciA9IGFyYml0cmFyeV92aXJ0X3RvX21hY2hpbmUocHRyKS5tYWRkcjsKLQl1LnZh bCA9IHB1ZF92YWxfbWEodmFsKTsKLQl4ZW5fZXh0ZW5kX21tdV91cGRhdGUoJnUpOwotCi0JeGVu X21jX2lzc3VlKFBBUkFWSVJUX0xBWllfTU1VKTsKLQotCXByZWVtcHRfZW5hYmxlKCk7Ci19Ci0K LXN0YXRpYyB2b2lkIHhlbl9zZXRfcHVkKHB1ZF90ICpwdHIsIHB1ZF90IHZhbCkKLXsKLQl0cmFj ZV94ZW5fbW11X3NldF9wdWQocHRyLCB2YWwpOwotCi0JLyogSWYgcGFnZSBpcyBub3QgcGlubmVk LCB3ZSBjYW4ganVzdCB1cGRhdGUgdGhlIGVudHJ5Ci0JICAgZGlyZWN0bHkgKi8KLQlpZiAoIXhl bl9wYWdlX3Bpbm5lZChwdHIpKSB7Ci0JCSpwdHIgPSB2YWw7Ci0JCXJldHVybjsKLQl9Ci0KLQl4 ZW5fc2V0X3B1ZF9oeXBlcihwdHIsIHZhbCk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfWDg2X1BBRQot c3RhdGljIHZvaWQgeGVuX3NldF9wdGVfYXRvbWljKHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUpCi17 Ci0JdHJhY2VfeGVuX21tdV9zZXRfcHRlX2F0b21pYyhwdGVwLCBwdGUpOwotCXNldF82NGJpdCgo dTY0ICopcHRlcCwgbmF0aXZlX3B0ZV92YWwocHRlKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9w dGVfY2xlYXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3Qg KnB0ZXApCi17Ci0JdHJhY2VfeGVuX21tdV9wdGVfY2xlYXIobW0sIGFkZHIsIHB0ZXApOwotCWlm ICgheGVuX2JhdGNoZWRfc2V0X3B0ZShwdGVwLCBuYXRpdmVfbWFrZV9wdGUoMCkpKQotCQluYXRp dmVfcHRlX2NsZWFyKG1tLCBhZGRyLCBwdGVwKTsKLX0KLQotc3RhdGljIHZvaWQgeGVuX3BtZF9j bGVhcihwbWRfdCAqcG1kcCkKLXsKLQl0cmFjZV94ZW5fbW11X3BtZF9jbGVhcihwbWRwKTsKLQlz ZXRfcG1kKHBtZHAsIF9fcG1kKDApKTsKLX0KLSNlbmRpZgkvKiBDT05GSUdfWDg2X1BBRSAqLwot Ci1fX3Zpc2libGUgcG1kX3QgeGVuX21ha2VfcG1kKHBtZHZhbF90IHBtZCkKLXsKLQlwbWQgPSBw dGVfcGZuX3RvX21mbihwbWQpOwotCXJldHVybiBuYXRpdmVfbWFrZV9wbWQocG1kKTsKLX0KLVBW X0NBTExFRV9TQVZFX1JFR1NfVEhVTksoeGVuX21ha2VfcG1kKTsKLQotI2lmIENPTkZJR19QR1RB QkxFX0xFVkVMUyA9PSA0Ci1fX3Zpc2libGUgcHVkdmFsX3QgeGVuX3B1ZF92YWwocHVkX3QgcHVk KQotewotCXJldHVybiBwdGVfbWZuX3RvX3BmbihwdWQucHVkKTsKLX0KLVBWX0NBTExFRV9TQVZF X1JFR1NfVEhVTksoeGVuX3B1ZF92YWwpOwotCi1fX3Zpc2libGUgcHVkX3QgeGVuX21ha2VfcHVk KHB1ZHZhbF90IHB1ZCkKLXsKLQlwdWQgPSBwdGVfcGZuX3RvX21mbihwdWQpOwotCi0JcmV0dXJu IG5hdGl2ZV9tYWtlX3B1ZChwdWQpOwotfQotUFZfQ0FMTEVFX1NBVkVfUkVHU19USFVOSyh4ZW5f bWFrZV9wdWQpOwotCi1zdGF0aWMgcGdkX3QgKnhlbl9nZXRfdXNlcl9wZ2QocGdkX3QgKnBnZCkK LXsKLQlwZ2RfdCAqcGdkX3BhZ2UgPSAocGdkX3QgKikoKCh1bnNpZ25lZCBsb25nKXBnZCkgJiBQ QUdFX01BU0spOwotCXVuc2lnbmVkIG9mZnNldCA9IHBnZCAtIHBnZF9wYWdlOwotCXBnZF90ICp1 c2VyX3B0ciA9IE5VTEw7Ci0KLQlpZiAob2Zmc2V0IDwgcGdkX2luZGV4KFVTRVJfTElNSVQpKSB7 Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0gdmlydF90b19wYWdlKHBnZF9wYWdlKTsKLQkJdXNlcl9w dHIgPSAocGdkX3QgKilwYWdlLT5wcml2YXRlOwotCQlpZiAodXNlcl9wdHIpCi0JCQl1c2VyX3B0 ciArPSBvZmZzZXQ7Ci0JfQotCi0JcmV0dXJuIHVzZXJfcHRyOwotfQotCi1zdGF0aWMgdm9pZCBf X3hlbl9zZXRfcGdkX2h5cGVyKHBnZF90ICpwdHIsIHBnZF90IHZhbCkKLXsKLQlzdHJ1Y3QgbW11 X3VwZGF0ZSB1OwotCi0JdS5wdHIgPSB2aXJ0X3RvX21hY2hpbmUocHRyKS5tYWRkcjsKLQl1LnZh bCA9IHBnZF92YWxfbWEodmFsKTsKLQl4ZW5fZXh0ZW5kX21tdV91cGRhdGUoJnUpOwotfQotCi0v KgotICogUmF3IGh5cGVyY2FsbC1iYXNlZCBzZXRfcGdkLCBpbnRlbmRlZCBmb3IgaW4gZWFybHkg Ym9vdCBiZWZvcmUKLSAqIHRoZXJlJ3MgYSBwYWdlIHN0cnVjdHVyZS4gIFRoaXMgaW1wbGllczoK LSAqICAxLiBUaGUgb25seSBleGlzdGluZyBwYWdldGFibGUgaXMgdGhlIGtlcm5lbCdzCi0gKiAg Mi4gSXQgaXMgYWx3YXlzIHBpbm5lZAotICogIDMuIEl0IGhhcyBubyB1c2VyIHBhZ2V0YWJsZSBh dHRhY2hlZCB0byBpdAotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgeGVuX3NldF9wZ2RfaHlwZXIo cGdkX3QgKnB0ciwgcGdkX3QgdmFsKQotewotCXByZWVtcHRfZGlzYWJsZSgpOwotCi0JeGVuX21j X2JhdGNoKCk7Ci0KLQlfX3hlbl9zZXRfcGdkX2h5cGVyKHB0ciwgdmFsKTsKLQotCXhlbl9tY19p c3N1ZShQQVJBVklSVF9MQVpZX01NVSk7Ci0KLQlwcmVlbXB0X2VuYWJsZSgpOwotfQotCi1zdGF0 aWMgdm9pZCB4ZW5fc2V0X3BnZChwZ2RfdCAqcHRyLCBwZ2RfdCB2YWwpCi17Ci0JcGdkX3QgKnVz ZXJfcHRyID0geGVuX2dldF91c2VyX3BnZChwdHIpOwotCi0JdHJhY2VfeGVuX21tdV9zZXRfcGdk KHB0ciwgdXNlcl9wdHIsIHZhbCk7Ci0KLQkvKiBJZiBwYWdlIGlzIG5vdCBwaW5uZWQsIHdlIGNh biBqdXN0IHVwZGF0ZSB0aGUgZW50cnkKLQkgICBkaXJlY3RseSAqLwotCWlmICgheGVuX3BhZ2Vf cGlubmVkKHB0cikpIHsKLQkJKnB0ciA9IHZhbDsKLQkJaWYgKHVzZXJfcHRyKSB7Ci0JCQlXQVJO X09OKHhlbl9wYWdlX3Bpbm5lZCh1c2VyX3B0cikpOwotCQkJKnVzZXJfcHRyID0gdmFsOwotCQl9 Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBJZiBpdCdzIHBpbm5lZCwgdGhlbiB3ZSBjYW4gYXQgbGVh c3QgYmF0Y2ggdGhlIGtlcm5lbCBhbmQKLQkgICB1c2VyIHVwZGF0ZXMgdG9nZXRoZXIuICovCi0J eGVuX21jX2JhdGNoKCk7Ci0KLQlfX3hlbl9zZXRfcGdkX2h5cGVyKHB0ciwgdmFsKTsKLQlpZiAo dXNlcl9wdHIpCi0JCV9feGVuX3NldF9wZ2RfaHlwZXIodXNlcl9wdHIsIHZhbCk7Ci0KLQl4ZW5f bWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9NTVUpOwotfQotI2VuZGlmCS8qIENPTkZJR19QR1RBQkxF X0xFVkVMUyA9PSA0ICovCi0KLS8qCi0gKiAoWWV0IGFub3RoZXIpIHBhZ2V0YWJsZSB3YWxrZXIu ICBUaGlzIG9uZSBpcyBpbnRlbmRlZCBmb3IgcGlubmluZyBhCi0gKiBwYWdldGFibGUuICBUaGlz IG1lYW5zIHRoYXQgaXQgd2Fsa3MgYSBwYWdldGFibGUgYW5kIGNhbGxzIHRoZQotICogY2FsbGJh Y2sgZnVuY3Rpb24gb24gZWFjaCBwYWdlIGl0IGZpbmRzIG1ha2luZyB1cCB0aGUgcGFnZSB0YWJs ZSwKLSAqIGF0IGV2ZXJ5IGxldmVsLiAgSXQgd2Fsa3MgdGhlIGVudGlyZSBwYWdldGFibGUsIGJ1 dCBpdCBvbmx5IGJvdGhlcnMKLSAqIHBpbm5pbmcgcHRlIHBhZ2VzIHdoaWNoIGFyZSBiZWxvdyBs aW1pdC4gIEluIHRoZSBub3JtYWwgY2FzZSB0aGlzCi0gKiB3aWxsIGJlIFNUQUNLX1RPUF9NQVgs IGJ1dCBhdCBib290IHdlIG5lZWQgdG8gcGluIHVwIHRvCi0gKiBGSVhBRERSX1RPUC4KLSAqCi0g KiBGb3IgMzItYml0IHRoZSBpbXBvcnRhbnQgYml0IGlzIHRoYXQgd2UgZG9uJ3QgcGluIGJleW9u ZCB0aGVyZSwKLSAqIGJlY2F1c2UgdGhlbiB3ZSBzdGFydCBnZXR0aW5nIGludG8gWGVuJ3MgcHRl cy4KLSAqCi0gKiBGb3IgNjQtYml0LCB3ZSBtdXN0IHNraXAgdGhlIFhlbiBob2xlIGluIHRoZSBt aWRkbGUgb2YgdGhlIGFkZHJlc3MKLSAqIHNwYWNlLCBqdXN0IGFmdGVyIHRoZSBiaWcgeDg2LTY0 IHZpcnR1YWwgaG9sZS4KLSAqLwotc3RhdGljIGludCBfX3hlbl9wZ2Rfd2FsayhzdHJ1Y3QgbW1f c3RydWN0ICptbSwgcGdkX3QgKnBnZCwKLQkJCSAgaW50ICgqZnVuYykoc3RydWN0IG1tX3N0cnVj dCAqbW0sIHN0cnVjdCBwYWdlICosCi0JCQkJICAgICAgZW51bSBwdF9sZXZlbCksCi0JCQkgIHVu c2lnbmVkIGxvbmcgbGltaXQpCi17Ci0JaW50IGZsdXNoID0gMDsKLQl1bnNpZ25lZCBob2xlX2xv dywgaG9sZV9oaWdoOwotCXVuc2lnbmVkIHBnZGlkeF9saW1pdCwgcHVkaWR4X2xpbWl0LCBwbWRp ZHhfbGltaXQ7Ci0JdW5zaWduZWQgcGdkaWR4LCBwdWRpZHgsIHBtZGlkeDsKLQotCS8qIFRoZSBs aW1pdCBpcyB0aGUgbGFzdCBieXRlIHRvIGJlIHRvdWNoZWQgKi8KLQlsaW1pdC0tOwotCUJVR19P TihsaW1pdCA+PSBGSVhBRERSX1RPUCk7Ci0KLQlpZiAoeGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRv X3RyYW5zbGF0ZWRfcGh5c21hcCkpCi0JCXJldHVybiAwOwotCi0JLyoKLQkgKiA2NC1iaXQgaGFz IGEgZ3JlYXQgYmlnIGhvbGUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgYWRkcmVzcwotCSAqIHNwYWNl LCB3aGljaCBjb250YWlucyB0aGUgWGVuIG1hcHBpbmdzLiAgT24gMzItYml0IHRoZXNlCi0JICog d2lsbCBlbmQgdXAgbWFraW5nIGEgemVyby1zaXplZCBob2xlIGFuZCBzbyBpcyBhIG5vLW9wLgot CSAqLwotCWhvbGVfbG93ID0gcGdkX2luZGV4KFVTRVJfTElNSVQpOwotCWhvbGVfaGlnaCA9IHBn ZF9pbmRleChQQUdFX09GRlNFVCk7Ci0KLQlwZ2RpZHhfbGltaXQgPSBwZ2RfaW5kZXgobGltaXQp OwotI2lmIFBUUlNfUEVSX1BVRCA+IDEKLQlwdWRpZHhfbGltaXQgPSBwdWRfaW5kZXgobGltaXQp OwotI2Vsc2UKLQlwdWRpZHhfbGltaXQgPSAwOwotI2VuZGlmCi0jaWYgUFRSU19QRVJfUE1EID4g MQotCXBtZGlkeF9saW1pdCA9IHBtZF9pbmRleChsaW1pdCk7Ci0jZWxzZQotCXBtZGlkeF9saW1p dCA9IDA7Ci0jZW5kaWYKLQotCWZvciAocGdkaWR4ID0gMDsgcGdkaWR4IDw9IHBnZGlkeF9saW1p dDsgcGdkaWR4KyspIHsKLQkJcHVkX3QgKnB1ZDsKLQotCQlpZiAocGdkaWR4ID49IGhvbGVfbG93 ICYmIHBnZGlkeCA8IGhvbGVfaGlnaCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghcGdkX3ZhbChw Z2RbcGdkaWR4XSkpCi0JCQljb250aW51ZTsKLQotCQlwdWQgPSBwdWRfb2Zmc2V0KCZwZ2RbcGdk aWR4XSwgMCk7Ci0KLQkJaWYgKFBUUlNfUEVSX1BVRCA+IDEpIC8qIG5vdCBmb2xkZWQgKi8KLQkJ CWZsdXNoIHw9ICgqZnVuYykobW0sIHZpcnRfdG9fcGFnZShwdWQpLCBQVF9QVUQpOwotCi0JCWZv ciAocHVkaWR4ID0gMDsgcHVkaWR4IDwgUFRSU19QRVJfUFVEOyBwdWRpZHgrKykgewotCQkJcG1k X3QgKnBtZDsKLQotCQkJaWYgKHBnZGlkeCA9PSBwZ2RpZHhfbGltaXQgJiYKLQkJCSAgICBwdWRp ZHggPiBwdWRpZHhfbGltaXQpCi0JCQkJZ290byBvdXQ7Ci0KLQkJCWlmIChwdWRfbm9uZShwdWRb cHVkaWR4XSkpCi0JCQkJY29udGludWU7Ci0KLQkJCXBtZCA9IHBtZF9vZmZzZXQoJnB1ZFtwdWRp ZHhdLCAwKTsKLQotCQkJaWYgKFBUUlNfUEVSX1BNRCA+IDEpIC8qIG5vdCBmb2xkZWQgKi8KLQkJ CQlmbHVzaCB8PSAoKmZ1bmMpKG1tLCB2aXJ0X3RvX3BhZ2UocG1kKSwgUFRfUE1EKTsKLQotCQkJ Zm9yIChwbWRpZHggPSAwOyBwbWRpZHggPCBQVFJTX1BFUl9QTUQ7IHBtZGlkeCsrKSB7Ci0JCQkJ c3RydWN0IHBhZ2UgKnB0ZTsKLQotCQkJCWlmIChwZ2RpZHggPT0gcGdkaWR4X2xpbWl0ICYmCi0J CQkJICAgIHB1ZGlkeCA9PSBwdWRpZHhfbGltaXQgJiYKLQkJCQkgICAgcG1kaWR4ID4gcG1kaWR4 X2xpbWl0KQotCQkJCQlnb3RvIG91dDsKLQotCQkJCWlmIChwbWRfbm9uZShwbWRbcG1kaWR4XSkp Ci0JCQkJCWNvbnRpbnVlOwotCi0JCQkJcHRlID0gcG1kX3BhZ2UocG1kW3BtZGlkeF0pOwotCQkJ CWZsdXNoIHw9ICgqZnVuYykobW0sIHB0ZSwgUFRfUFRFKTsKLQkJCX0KLQkJfQotCX0KLQotb3V0 OgotCS8qIERvIHRoZSB0b3AgbGV2ZWwgbGFzdCwgc28gdGhhdCB0aGUgY2FsbGJhY2tzIGNhbiB1 c2UgaXQgYXMKLQkgICBhIGN1ZSB0byBkbyBmaW5hbCB0aGluZ3MgbGlrZSB0bGIgZmx1c2hlcy4g Ki8KLQlmbHVzaCB8PSAoKmZ1bmMpKG1tLCB2aXJ0X3RvX3BhZ2UocGdkKSwgUFRfUEdEKTsKLQot CXJldHVybiBmbHVzaDsKLX0KLQotc3RhdGljIGludCB4ZW5fcGdkX3dhbGsoc3RydWN0IG1tX3N0 cnVjdCAqbW0sCi0JCQlpbnQgKCpmdW5jKShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHBh Z2UgKiwKLQkJCQkgICAgZW51bSBwdF9sZXZlbCksCi0JCQl1bnNpZ25lZCBsb25nIGxpbWl0KQot ewotCXJldHVybiBfX3hlbl9wZ2Rfd2FsayhtbSwgbW0tPnBnZCwgZnVuYywgbGltaXQpOwotfQot Ci0vKiBJZiB3ZSdyZSB1c2luZyBzcGxpdCBwdGUgbG9ja3MsIHRoZW4gdGFrZSB0aGUgcGFnZSdz IGxvY2sgYW5kCi0gICByZXR1cm4gYSBwb2ludGVyIHRvIGl0LiAgT3RoZXJ3aXNlIHJldHVybiBO VUxMLiAqLwotc3RhdGljIHNwaW5sb2NrX3QgKnhlbl9wdGVfbG9jayhzdHJ1Y3QgcGFnZSAqcGFn ZSwgc3RydWN0IG1tX3N0cnVjdCAqbW0pCi17Ci0Jc3BpbmxvY2tfdCAqcHRsID0gTlVMTDsKLQot I2lmIFVTRV9TUExJVF9QVEVfUFRMT0NLUwotCXB0bCA9IHB0bG9ja19wdHIocGFnZSk7Ci0Jc3Bp bl9sb2NrX25lc3RfbG9jayhwdGwsICZtbS0+cGFnZV90YWJsZV9sb2NrKTsKLSNlbmRpZgotCi0J cmV0dXJuIHB0bDsKLX0KLQotc3RhdGljIHZvaWQgeGVuX3B0ZV91bmxvY2sodm9pZCAqdikKLXsK LQlzcGlubG9ja190ICpwdGwgPSB2OwotCXNwaW5fdW5sb2NrKHB0bCk7Ci19Ci0KLXN0YXRpYyB2 b2lkIHhlbl9kb19waW4odW5zaWduZWQgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgcGZuKQotewotCXN0 cnVjdCBtbXVleHRfb3Agb3A7Ci0KLQlvcC5jbWQgPSBsZXZlbDsKLQlvcC5hcmcxLm1mbiA9IHBm bl90b19tZm4ocGZuKTsKLQotCXhlbl9leHRlbmRfbW11ZXh0X29wKCZvcCk7Ci19Ci0KLXN0YXRp YyBpbnQgeGVuX3Bpbl9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgcGFnZSAqcGFn ZSwKLQkJCWVudW0gcHRfbGV2ZWwgbGV2ZWwpCi17Ci0JdW5zaWduZWQgcGdmbCA9IFRlc3RTZXRQ YWdlUGlubmVkKHBhZ2UpOwotCWludCBmbHVzaDsKLQotCWlmIChwZ2ZsKQotCQlmbHVzaCA9IDA7 CQkvKiBhbHJlYWR5IHBpbm5lZCAqLwotCWVsc2UgaWYgKFBhZ2VIaWdoTWVtKHBhZ2UpKQotCQkv KiBrbWFwcyBuZWVkIGZsdXNoaW5nIGlmIHdlIGZvdW5kIGFuIHVucGlubmVkCi0JCSAgIGhpZ2hw YWdlICovCi0JCWZsdXNoID0gMTsKLQllbHNlIHsKLQkJdm9pZCAqcHQgPSBsb3dtZW1fcGFnZV9h ZGRyZXNzKHBhZ2UpOwotCQl1bnNpZ25lZCBsb25nIHBmbiA9IHBhZ2VfdG9fcGZuKHBhZ2UpOwot CQlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jcyA9IF9feGVuX21jX2VudHJ5KDApOwotCQlzcGlu bG9ja190ICpwdGw7Ci0KLQkJZmx1c2ggPSAwOwotCi0JCS8qCi0JCSAqIFdlIG5lZWQgdG8gaG9s ZCB0aGUgcGFnZXRhYmxlIGxvY2sgYmV0d2VlbiB0aGUgdGltZQotCQkgKiB3ZSBtYWtlIHRoZSBw YWdldGFibGUgUk8gYW5kIHdoZW4gd2UgYWN0dWFsbHkgcGluCi0JCSAqIGl0LiAgSWYgd2UgZG9u J3QsIHRoZW4gb3RoZXIgdXNlcnMgbWF5IGNvbWUgaW4gYW5kCi0JCSAqIGF0dGVtcHQgdG8gdXBk YXRlIHRoZSBwYWdldGFibGUgYnkgd3JpdGluZyBpdCwKLQkJICogd2hpY2ggd2lsbCBmYWlsIGJl Y2F1c2UgdGhlIG1lbW9yeSBpcyBSTyBidXQgbm90Ci0JCSAqIHBpbm5lZCwgc28gWGVuIHdvbid0 IGRvIHRoZSB0cmFwJ24nZW11bGF0ZS4KLQkJICoKLQkJICogSWYgd2UncmUgdXNpbmcgc3BsaXQg cHRlIGxvY2tzLCB3ZSBjYW4ndCBob2xkIHRoZQotCQkgKiBlbnRpcmUgcGFnZXRhYmxlJ3Mgd29y dGggb2YgbG9ja3MgZHVyaW5nIHRoZQotCQkgKiB0cmF2ZXJzZSwgYmVjYXVzZSB3ZSBtYXkgd3Jh cCB0aGUgcHJlZW1wdCBjb3VudCAoOAotCQkgKiBiaXRzKS4gIFRoZSBzb2x1dGlvbiBpcyB0byBt YXJrIFJPIGFuZCBwaW4gZWFjaCBQVEUKLQkJICogcGFnZSB3aGlsZSBob2xkaW5nIHRoZSBsb2Nr LiAgVGhpcyBtZWFucyB0aGUgbnVtYmVyCi0JCSAqIG9mIGxvY2tzIHdlIGVuZCB1cCBob2xkaW5n IGlzIG5ldmVyIG1vcmUgdGhhbiBhCi0JCSAqIGJhdGNoIHNpemUgKH4zMiBlbnRyaWVzLCBhdCBw cmVzZW50KS4KLQkJICoKLQkJICogSWYgd2UncmUgbm90IHVzaW5nIHNwbGl0IHB0ZSBsb2Nrcywg d2UgbmVlZG4ndCBwaW4KLQkJICogdGhlIFBURSBwYWdlcyBpbmRlcGVuZGVudGx5LCBiZWNhdXNl IHdlJ3JlCi0JCSAqIHByb3RlY3RlZCBieSB0aGUgb3ZlcmFsbCBwYWdldGFibGUgbG9jay4KLQkJ ICovCi0JCXB0bCA9IE5VTEw7Ci0JCWlmIChsZXZlbCA9PSBQVF9QVEUpCi0JCQlwdGwgPSB4ZW5f cHRlX2xvY2socGFnZSwgbW0pOwotCi0JCU1VTFRJX3VwZGF0ZV92YV9tYXBwaW5nKG1jcy5tYywg KHVuc2lnbmVkIGxvbmcpcHQsCi0JCQkJCXBmbl9wdGUocGZuLCBQQUdFX0tFUk5FTF9STyksCi0J CQkJCWxldmVsID09IFBUX1BHRCA/IFVWTUZfVExCX0ZMVVNIIDogMCk7Ci0KLQkJaWYgKHB0bCkg ewotCQkJeGVuX2RvX3BpbihNTVVFWFRfUElOX0wxX1RBQkxFLCBwZm4pOwotCi0JCQkvKiBRdWV1 ZSBhIGRlZmVycmVkIHVubG9jayBmb3Igd2hlbiB0aGlzIGJhdGNoCi0JCQkgICBpcyBjb21wbGV0 ZWQuICovCi0JCQl4ZW5fbWNfY2FsbGJhY2soeGVuX3B0ZV91bmxvY2ssIHB0bCk7Ci0JCX0KLQl9 Ci0KLQlyZXR1cm4gZmx1c2g7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGp1c3QgYWZ0ZXIgYSBt bSBoYXMgYmVlbiBjcmVhdGVkLCBidXQgaXQgaGFzIG5vdAotICAgYmVlbiB1c2VkIHlldC4gIFdl IG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaXRzIHBhZ2V0YWJsZSBpcyBhbGwKLSAgIHJlYWQtb25s eSwgYW5kIGNhbiBiZSBwaW5uZWQuICovCi1zdGF0aWMgdm9pZCBfX3hlbl9wZ2RfcGluKHN0cnVj dCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdkKQotewotCXRyYWNlX3hlbl9tbXVfcGdkX3Bpbiht bSwgcGdkKTsKLQotCXhlbl9tY19iYXRjaCgpOwotCi0JaWYgKF9feGVuX3BnZF93YWxrKG1tLCBw Z2QsIHhlbl9waW5fcGFnZSwgVVNFUl9MSU1JVCkpIHsKLQkJLyogcmUtZW5hYmxlIGludGVycnVw dHMgZm9yIGZsdXNoaW5nICovCi0JCXhlbl9tY19pc3N1ZSgwKTsKLQotCQlrbWFwX2ZsdXNoX3Vu dXNlZCgpOwotCi0JCXhlbl9tY19iYXRjaCgpOwotCX0KLQotI2lmZGVmIENPTkZJR19YODZfNjQK LQl7Ci0JCXBnZF90ICp1c2VyX3BnZCA9IHhlbl9nZXRfdXNlcl9wZ2QocGdkKTsKLQotCQl4ZW5f ZG9fcGluKE1NVUVYVF9QSU5fTDRfVEFCTEUsIFBGTl9ET1dOKF9fcGEocGdkKSkpOwotCi0JCWlm ICh1c2VyX3BnZCkgewotCQkJeGVuX3Bpbl9wYWdlKG1tLCB2aXJ0X3RvX3BhZ2UodXNlcl9wZ2Qp LCBQVF9QR0QpOwotCQkJeGVuX2RvX3BpbihNTVVFWFRfUElOX0w0X1RBQkxFLAotCQkJCSAgIFBG Tl9ET1dOKF9fcGEodXNlcl9wZ2QpKSk7Ci0JCX0KLQl9Ci0jZWxzZSAvKiBDT05GSUdfWDg2XzMy ICovCi0jaWZkZWYgQ09ORklHX1g4Nl9QQUUKLQkvKiBOZWVkIHRvIG1ha2Ugc3VyZSB1bnNoYXJl ZCBrZXJuZWwgUE1EIGlzIHBpbm5hYmxlICovCi0JeGVuX3Bpbl9wYWdlKG1tLCBwZ2RfcGFnZShw Z2RbcGdkX2luZGV4KFRBU0tfU0laRSldKSwKLQkJICAgICBQVF9QTUQpOwotI2VuZGlmCi0JeGVu X2RvX3BpbihNTVVFWFRfUElOX0wzX1RBQkxFLCBQRk5fRE9XTihfX3BhKHBnZCkpKTsKLSNlbmRp ZiAvKiBDT05GSUdfWDg2XzY0ICovCi0JeGVuX21jX2lzc3VlKDApOwotfQotCi1zdGF0aWMgdm9p ZCB4ZW5fcGdkX3BpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSkKLXsKLQlfX3hlbl9wZ2RfcGluKG1t LCBtbS0+cGdkKTsKLX0KLQotLyoKLSAqIE9uIHNhdmUsIHdlIG5lZWQgdG8gcGluIGFsbCBwYWdl dGFibGVzIHRvIG1ha2Ugc3VyZSB0aGV5IGdldCB0aGVpcgotICogbWZucyB0dXJuZWQgaW50byBw Zm5zLiAgU2VhcmNoIHRoZSBsaXN0IGZvciBhbnkgdW5waW5uZWQgcGdkcyBhbmQgcGluCi0gKiB0 aGVtICh1bnBpbm5lZCBwZ2RzIGFyZSBub3QgY3VycmVudGx5IGluIHVzZSwgcHJvYmFibHkgYmVj YXVzZSB0aGUKLSAqIHByb2Nlc3MgaXMgdW5kZXIgY29uc3RydWN0aW9uIG9yIGRlc3RydWN0aW9u KS4KLSAqCi0gKiBFeHBlY3RlZCB0byBiZSBjYWxsZWQgaW4gc3RvcF9tYWNoaW5lKCkgKCJlcXVp dmFsZW50IHRvIHRha2luZwotICogZXZlcnkgc3BpbmxvY2sgaW4gdGhlIHN5c3RlbSIpLCBzbyB0 aGUgbG9ja2luZyBkb2Vzbid0IHJlYWxseQotICogbWF0dGVyIGFsbCB0aGF0IG11Y2guCi0gKi8K LXZvaWQgeGVuX21tX3Bpbl9hbGwodm9pZCkKLXsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQotCXNw aW5fbG9jaygmcGdkX2xvY2spOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShwYWdlLCAmcGdkX2xp c3QsIGxydSkgewotCQlpZiAoIVBhZ2VQaW5uZWQocGFnZSkpIHsKLQkJCV9feGVuX3BnZF9waW4o JmluaXRfbW0sIChwZ2RfdCAqKXBhZ2VfYWRkcmVzcyhwYWdlKSk7Ci0JCQlTZXRQYWdlU2F2ZVBp bm5lZChwYWdlKTsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrKCZwZ2RfbG9jayk7Ci19Ci0KLS8q Ci0gKiBUaGUgaW5pdF9tbSBwYWdldGFibGUgaXMgcmVhbGx5IHBpbm5lZCBhcyBzb29uIGFzIGl0 cyBjcmVhdGVkLCBidXQKLSAqIHRoYXQncyBiZWZvcmUgd2UgaGF2ZSBwYWdlIHN0cnVjdHVyZXMg dG8gc3RvcmUgdGhlIGJpdHMuICBTbyBkbyBhbGwKLSAqIHRoZSBib29rLWtlZXBpbmcgbm93Lgot ICovCi1zdGF0aWMgaW50IF9faW5pdCB4ZW5fbWFya19waW5uZWQoc3RydWN0IG1tX3N0cnVjdCAq bW0sIHN0cnVjdCBwYWdlICpwYWdlLAotCQkJCSAgZW51bSBwdF9sZXZlbCBsZXZlbCkKLXsKLQlT ZXRQYWdlUGlubmVkKHBhZ2UpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQg eGVuX21hcmtfaW5pdF9tbV9waW5uZWQodm9pZCkKLXsKLQl4ZW5fcGdkX3dhbGsoJmluaXRfbW0s IHhlbl9tYXJrX3Bpbm5lZCwgRklYQUREUl9UT1ApOwotfQotCi1zdGF0aWMgaW50IHhlbl91bnBp bl9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJCSAgZW51 bSBwdF9sZXZlbCBsZXZlbCkKLXsKLQl1bnNpZ25lZCBwZ2ZsID0gVGVzdENsZWFyUGFnZVBpbm5l ZChwYWdlKTsKLQotCWlmIChwZ2ZsICYmICFQYWdlSGlnaE1lbShwYWdlKSkgewotCQl2b2lkICpw dCA9IGxvd21lbV9wYWdlX2FkZHJlc3MocGFnZSk7Ci0JCXVuc2lnbmVkIGxvbmcgcGZuID0gcGFn ZV90b19wZm4ocGFnZSk7Ci0JCXNwaW5sb2NrX3QgKnB0bCA9IE5VTEw7Ci0JCXN0cnVjdCBtdWx0 aWNhbGxfc3BhY2UgbWNzOwotCi0JCS8qCi0JCSAqIERvIHRoZSBjb252ZXJzZSB0byBwaW5fcGFn ZS4gIElmIHdlJ3JlIHVzaW5nIHNwbGl0Ci0JCSAqIHB0ZSBsb2Nrcywgd2UgbXVzdCBiZSBob2xk aW5nIHRoZSBsb2NrIGZvciB3aGlsZQotCQkgKiB0aGUgcHRlIHBhZ2UgaXMgdW5waW5uZWQgYnV0 IHN0aWxsIFJPIHRvIHByZXZlbnQKLQkJICogY29uY3VycmVudCB1cGRhdGVzIGZyb20gc2VlaW5n IGl0IGluIHRoaXMKLQkJICogcGFydGlhbGx5LXBpbm5lZCBzdGF0ZS4KLQkJICovCi0JCWlmIChs ZXZlbCA9PSBQVF9QVEUpIHsKLQkJCXB0bCA9IHhlbl9wdGVfbG9jayhwYWdlLCBtbSk7Ci0KLQkJ CWlmIChwdGwpCi0JCQkJeGVuX2RvX3BpbihNTVVFWFRfVU5QSU5fVEFCTEUsIHBmbik7Ci0JCX0K LQotCQltY3MgPSBfX3hlbl9tY19lbnRyeSgwKTsKLQotCQlNVUxUSV91cGRhdGVfdmFfbWFwcGlu ZyhtY3MubWMsICh1bnNpZ25lZCBsb25nKXB0LAotCQkJCQlwZm5fcHRlKHBmbiwgUEFHRV9LRVJO RUwpLAotCQkJCQlsZXZlbCA9PSBQVF9QR0QgPyBVVk1GX1RMQl9GTFVTSCA6IDApOwotCi0JCWlm IChwdGwpIHsKLQkJCS8qIHVubG9jayB3aGVuIGJhdGNoIGNvbXBsZXRlZCAqLwotCQkJeGVuX21j X2NhbGxiYWNrKHhlbl9wdGVfdW5sb2NrLCBwdGwpOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7CQkv KiBuZXZlciBuZWVkIHRvIGZsdXNoIG9uIHVucGluICovCi19Ci0KLS8qIFJlbGVhc2UgYSBwYWdl dGFibGVzIHBhZ2VzIGJhY2sgYXMgbm9ybWFsIFJXICovCi1zdGF0aWMgdm9pZCBfX3hlbl9wZ2Rf dW5waW4oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QpCi17Ci0JdHJhY2VfeGVuX21t dV9wZ2RfdW5waW4obW0sIHBnZCk7Ci0KLQl4ZW5fbWNfYmF0Y2goKTsKLQotCXhlbl9kb19waW4o TU1VRVhUX1VOUElOX1RBQkxFLCBQRk5fRE9XTihfX3BhKHBnZCkpKTsKLQotI2lmZGVmIENPTkZJ R19YODZfNjQKLQl7Ci0JCXBnZF90ICp1c2VyX3BnZCA9IHhlbl9nZXRfdXNlcl9wZ2QocGdkKTsK LQotCQlpZiAodXNlcl9wZ2QpIHsKLQkJCXhlbl9kb19waW4oTU1VRVhUX1VOUElOX1RBQkxFLAot CQkJCSAgIFBGTl9ET1dOKF9fcGEodXNlcl9wZ2QpKSk7Ci0JCQl4ZW5fdW5waW5fcGFnZShtbSwg dmlydF90b19wYWdlKHVzZXJfcGdkKSwgUFRfUEdEKTsKLQkJfQotCX0KLSNlbmRpZgotCi0jaWZk ZWYgQ09ORklHX1g4Nl9QQUUKLQkvKiBOZWVkIHRvIG1ha2Ugc3VyZSB1bnNoYXJlZCBrZXJuZWwg UE1EIGlzIHVucGlubmVkICovCi0JeGVuX3VucGluX3BhZ2UobW0sIHBnZF9wYWdlKHBnZFtwZ2Rf aW5kZXgoVEFTS19TSVpFKV0pLAotCQkgICAgICAgUFRfUE1EKTsKLSNlbmRpZgotCi0JX194ZW5f cGdkX3dhbGsobW0sIHBnZCwgeGVuX3VucGluX3BhZ2UsIFVTRVJfTElNSVQpOwotCi0JeGVuX21j X2lzc3VlKDApOwotfQotCi1zdGF0aWMgdm9pZCB4ZW5fcGdkX3VucGluKHN0cnVjdCBtbV9zdHJ1 Y3QgKm1tKQotewotCV9feGVuX3BnZF91bnBpbihtbSwgbW0tPnBnZCk7Ci19Ci0KLS8qCi0gKiBP biByZXN1bWUsIHVuZG8gYW55IHBpbm5pbmcgZG9uZSBhdCBzYXZlLCBzbyB0aGF0IHRoZSByZXN0 IG9mIHRoZQotICoga2VybmVsIGRvZXNuJ3Qgc2VlIGFueSB1bmV4cGVjdGVkIHBpbm5lZCBwYWdl dGFibGVzLgotICovCi12b2lkIHhlbl9tbV91bnBpbl9hbGwodm9pZCkKLXsKLQlzdHJ1Y3QgcGFn ZSAqcGFnZTsKLQotCXNwaW5fbG9jaygmcGdkX2xvY2spOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRy eShwYWdlLCAmcGdkX2xpc3QsIGxydSkgewotCQlpZiAoUGFnZVNhdmVQaW5uZWQocGFnZSkpIHsK LQkJCUJVR19PTighUGFnZVBpbm5lZChwYWdlKSk7Ci0JCQlfX3hlbl9wZ2RfdW5waW4oJmluaXRf bW0sIChwZ2RfdCAqKXBhZ2VfYWRkcmVzcyhwYWdlKSk7Ci0JCQlDbGVhclBhZ2VTYXZlUGlubmVk KHBhZ2UpOwotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2soJnBnZF9sb2NrKTsKLX0KLQotc3RhdGlj IHZvaWQgeGVuX2FjdGl2YXRlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXYsIHN0cnVjdCBtbV9z dHJ1Y3QgKm5leHQpCi17Ci0Jc3Bpbl9sb2NrKCZuZXh0LT5wYWdlX3RhYmxlX2xvY2spOwotCXhl bl9wZ2RfcGluKG5leHQpOwotCXNwaW5fdW5sb2NrKCZuZXh0LT5wYWdlX3RhYmxlX2xvY2spOwot fQotCi1zdGF0aWMgdm9pZCB4ZW5fZHVwX21tYXAoc3RydWN0IG1tX3N0cnVjdCAqb2xkbW0sIHN0 cnVjdCBtbV9zdHJ1Y3QgKm1tKQotewotCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7 Ci0JeGVuX3BnZF9waW4obW0pOwotCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsK LX0KLQotCi0jaWZkZWYgQ09ORklHX1NNUAotLyogQW5vdGhlciBjcHUgbWF5IHN0aWxsIGhhdmUg dGhlaXIgJWNyMyBwb2ludGluZyBhdCB0aGUgcGFnZXRhYmxlLCBzbwotICAgd2UgbmVlZCB0byBy ZXBvaW50IGl0IHNvbWV3aGVyZSBlbHNlIGJlZm9yZSB3ZSBjYW4gdW5waW4gaXQuICovCi1zdGF0 aWMgdm9pZCBkcm9wX290aGVyX21tX3JlZih2b2lkICppbmZvKQotewotCXN0cnVjdCBtbV9zdHJ1 Y3QgKm1tID0gaW5mbzsKLQlzdHJ1Y3QgbW1fc3RydWN0ICphY3RpdmVfbW07Ci0KLQlhY3RpdmVf bW0gPSB0aGlzX2NwdV9yZWFkKGNwdV90bGJzdGF0ZS5hY3RpdmVfbW0pOwotCi0JaWYgKGFjdGl2 ZV9tbSA9PSBtbSAmJiB0aGlzX2NwdV9yZWFkKGNwdV90bGJzdGF0ZS5zdGF0ZSkgIT0gVExCU1RB VEVfT0spCi0JCWxlYXZlX21tKHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0KLQkvKiBJZiB0aGlzIGNw dSBzdGlsbCBoYXMgYSBzdGFsZSBjcjMgcmVmZXJlbmNlLCB0aGVuIG1ha2Ugc3VyZQotCSAgIGl0 IGhhcyBiZWVuIGZsdXNoZWQuICovCi0JaWYgKHRoaXNfY3B1X3JlYWQoeGVuX2N1cnJlbnRfY3Iz KSA9PSBfX3BhKG1tLT5wZ2QpKQotCQlsb2FkX2NyMyhzd2FwcGVyX3BnX2Rpcik7Ci19Ci0KLXN0 YXRpYyB2b2lkIHhlbl9kcm9wX21tX3JlZihzdHJ1Y3QgbW1fc3RydWN0ICptbSkKLXsKLQljcHVt YXNrX3Zhcl90IG1hc2s7Ci0JdW5zaWduZWQgY3B1OwotCi0JaWYgKGN1cnJlbnQtPmFjdGl2ZV9t bSA9PSBtbSkgewotCQlpZiAoY3VycmVudC0+bW0gPT0gbW0pCi0JCQlsb2FkX2NyMyhzd2FwcGVy X3BnX2Rpcik7Ci0JCWVsc2UKLQkJCWxlYXZlX21tKHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JfQot Ci0JLyogR2V0IHRoZSAib2ZmaWNpYWwiIHNldCBvZiBjcHVzIHJlZmVycmluZyB0byBvdXIgcGFn ZXRhYmxlLiAqLwotCWlmICghYWxsb2NfY3B1bWFza192YXIoJm1hc2ssIEdGUF9BVE9NSUMpKSB7 Ci0JCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7Ci0JCQlpZiAoIWNwdW1hc2tfdGVzdF9jcHUo Y3B1LCBtbV9jcHVtYXNrKG1tKSkKLQkJCSAgICAmJiBwZXJfY3B1KHhlbl9jdXJyZW50X2NyMywg Y3B1KSAhPSBfX3BhKG1tLT5wZ2QpKQotCQkJCWNvbnRpbnVlOwotCQkJc21wX2NhbGxfZnVuY3Rp b25fc2luZ2xlKGNwdSwgZHJvcF9vdGhlcl9tbV9yZWYsIG1tLCAxKTsKLQkJfQotCQlyZXR1cm47 Ci0JfQotCWNwdW1hc2tfY29weShtYXNrLCBtbV9jcHVtYXNrKG1tKSk7Ci0KLQkvKiBJdCdzIHBv c3NpYmxlIHRoYXQgYSB2Y3B1IG1heSBoYXZlIGEgc3RhbGUgcmVmZXJlbmNlIHRvIG91cgotCSAg IGNyMywgYmVjYXVzZSBpdHMgaW4gbGF6eSBtb2RlLCBhbmQgaXQgaGFzbid0IHlldCBmbHVzaGVk Ci0JICAgaXRzIHNldCBvZiBwZW5kaW5nIGh5cGVyY2FsbHMgeWV0LiAgSW4gdGhpcyBjYXNlLCB3 ZSBjYW4KLQkgICBsb29rIGF0IGl0cyBhY3R1YWwgY3VycmVudCBjcjMgdmFsdWUsIGFuZCBmb3Jj ZSBpdCB0byBmbHVzaAotCSAgIGlmIG5lZWRlZC4gKi8KLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNw dSkgewotCQlpZiAocGVyX2NwdSh4ZW5fY3VycmVudF9jcjMsIGNwdSkgPT0gX19wYShtbS0+cGdk KSkKLQkJCWNwdW1hc2tfc2V0X2NwdShjcHUsIG1hc2spOwotCX0KLQotCWlmICghY3B1bWFza19l bXB0eShtYXNrKSkKLQkJc21wX2NhbGxfZnVuY3Rpb25fbWFueShtYXNrLCBkcm9wX290aGVyX21t X3JlZiwgbW0sIDEpOwotCWZyZWVfY3B1bWFza192YXIobWFzayk7Ci19Ci0jZWxzZQotc3RhdGlj IHZvaWQgeGVuX2Ryb3BfbW1fcmVmKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQotewotCWlmIChjdXJy ZW50LT5hY3RpdmVfbW0gPT0gbW0pCi0JCWxvYWRfY3IzKHN3YXBwZXJfcGdfZGlyKTsKLX0KLSNl bmRpZgotCi0vKgotICogV2hpbGUgYSBwcm9jZXNzIHJ1bnMsIFhlbiBwaW5zIGl0cyBwYWdldGFi bGVzLCB3aGljaCBtZWFucyB0aGF0IHRoZQotICogaHlwZXJ2aXNvciBmb3JjZXMgaXQgdG8gYmUg cmVhZC1vbmx5LCBhbmQgaXQgY29udHJvbHMgYWxsIHVwZGF0ZXMKLSAqIHRvIGl0LiAgVGhpcyBt ZWFucyB0aGF0IGFsbCBwYWdldGFibGUgdXBkYXRlcyBoYXZlIHRvIGdvIHZpYSB0aGUKLSAqIGh5 cGVydmlzb3IsIHdoaWNoIGlzIG1vZGVyYXRlbHkgZXhwZW5zaXZlLgotICoKLSAqIFNpbmNlIHdl J3JlIHB1bGxpbmcgdGhlIHBhZ2V0YWJsZSBkb3duLCB3ZSBzd2l0Y2ggdG8gdXNlIGluaXRfbW0s Ci0gKiB1bnBpbiBvbGQgcHJvY2VzcyBwYWdldGFibGUgYW5kIG1hcmsgaXQgYWxsIHJlYWQtd3Jp dGUsIHdoaWNoCi0gKiBhbGxvd3MgZnVydGhlciBvcGVyYXRpb25zIG9uIGl0IHRvIGJlIHNpbXBs ZSBtZW1vcnkgYWNjZXNzZXMuCi0gKgotICogVGhlIG9ubHkgc3VidGxlIHBvaW50IGlzIHRoYXQg YW5vdGhlciBDUFUgbWF5IGJlIHN0aWxsIHVzaW5nIHRoZQotICogcGFnZXRhYmxlIGJlY2F1c2Ug b2YgbGF6eSB0bGIgZmx1c2hpbmcuICBUaGlzIG1lYW5zIHdlIG5lZWQgbmVlZCB0bwotICogc3dp dGNoIGFsbCBDUFVzIG9mZiB0aGlzIHBhZ2V0YWJsZSBiZWZvcmUgd2UgY2FuIHVucGluIGl0Lgot ICovCi1zdGF0aWMgdm9pZCB4ZW5fZXhpdF9tbWFwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQotewot CWdldF9jcHUoKTsJCS8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBtb3ZlIGFyb3VuZCAqLwotCXhlbl9k cm9wX21tX3JlZihtbSk7Ci0JcHV0X2NwdSgpOwotCi0Jc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJs ZV9sb2NrKTsKLQotCS8qIHBnZCBtYXkgbm90IGJlIHBpbm5lZCBpbiB0aGUgZXJyb3IgZXhpdCBw YXRoIG9mIGV4ZWN2ZSAqLwotCWlmICh4ZW5fcGFnZV9waW5uZWQobW0tPnBnZCkpCi0JCXhlbl9w Z2RfdW5waW4obW0pOwotCi0Jc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwotfQot Ci1zdGF0aWMgdm9pZCB4ZW5fcG9zdF9hbGxvY2F0b3JfaW5pdCh2b2lkKTsKLQotc3RhdGljIHZv aWQgX19pbml0IHBpbl9wYWdldGFibGVfcGZuKHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBw Zm4pCi17Ci0Jc3RydWN0IG1tdWV4dF9vcCBvcDsKLQotCW9wLmNtZCA9IGNtZDsKLQlvcC5hcmcx Lm1mbiA9IHBmbl90b19tZm4ocGZuKTsKLQlpZiAoSFlQRVJWSVNPUl9tbXVleHRfb3AoJm9wLCAx LCBOVUxMLCBET01JRF9TRUxGKSkKLQkJQlVHKCk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfWDg2XzY0 Ci1zdGF0aWMgdm9pZCBfX2luaXQgeGVuX2NsZWFuaGlnaG1hcCh1bnNpZ25lZCBsb25nIHZhZGRy LAotCQkJCSAgICB1bnNpZ25lZCBsb25nIHZhZGRyX2VuZCkKLXsKLQl1bnNpZ25lZCBsb25nIGtl cm5lbF9lbmQgPSByb3VuZHVwKCh1bnNpZ25lZCBsb25nKV9icmtfZW5kLCBQTURfU0laRSkgLSAx OwotCXBtZF90ICpwbWQgPSBsZXZlbDJfa2VybmVsX3BndCArIHBtZF9pbmRleCh2YWRkcik7Ci0K LQkvKiBOT1RFOiBUaGUgbG9vcCBpcyBtb3JlIGdyZWVkeSB0aGFuIHRoZSBjbGVhbnVwX2hpZ2ht YXAgdmFyaWFudC4KLQkgKiBXZSBpbmNsdWRlIHRoZSBQTUQgcGFzc2VkIGluIG9uIF9ib3RoXyBi b3VuZGFyaWVzLiAqLwotCWZvciAoOyB2YWRkciA8PSB2YWRkcl9lbmQgJiYgKHBtZCA8IChsZXZl bDJfa2VybmVsX3BndCArIFBUUlNfUEVSX1BNRCkpOwotCQkJcG1kKyssIHZhZGRyICs9IFBNRF9T SVpFKSB7Ci0JCWlmIChwbWRfbm9uZSgqcG1kKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAodmFkZHIg PCAodW5zaWduZWQgbG9uZykgX3RleHQgfHwgdmFkZHIgPiBrZXJuZWxfZW5kKQotCQkJc2V0X3Bt ZChwbWQsIF9fcG1kKDApKTsKLQl9Ci0JLyogSW4gY2FzZSB3ZSBkaWQgc29tZXRoaW5nIHNpbGx5 LCB3ZSBzaG91bGQgY3Jhc2ggaW4gdGhpcyBmdW5jdGlvbgotCSAqIGluc3RlYWQgb2Ygc29tZXdo ZXJlIGxhdGVyIGFuZCBiZSBjb25mdXNpbmcuICovCi0JeGVuX21jX2ZsdXNoKCk7Ci19Ci0KLS8q Ci0gKiBNYWtlIGEgcGFnZSByYW5nZSB3cml0ZWFibGUgYW5kIGZyZWUgaXQuCi0gKi8KLXN0YXRp YyB2b2lkIF9faW5pdCB4ZW5fZnJlZV9yb19wYWdlcyh1bnNpZ25lZCBsb25nIHBhZGRyLCB1bnNp Z25lZCBsb25nIHNpemUpCi17Ci0Jdm9pZCAqdmFkZHIgPSBfX3ZhKHBhZGRyKTsKLQl2b2lkICp2 YWRkcl9lbmQgPSB2YWRkciArIHNpemU7Ci0KLQlmb3IgKDsgdmFkZHIgPCB2YWRkcl9lbmQ7IHZh ZGRyICs9IFBBR0VfU0laRSkKLQkJbWFrZV9sb3dtZW1fcGFnZV9yZWFkd3JpdGUodmFkZHIpOwot Ci0JbWVtYmxvY2tfZnJlZShwYWRkciwgc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB4 ZW5fY2xlYW5tZm5tYXBfZnJlZV9wZ3RibCh2b2lkICpwZ3RibCwgYm9vbCB1bnBpbikKLXsKLQl1 bnNpZ25lZCBsb25nIHBhID0gX19wYShwZ3RibCkgJiBQSFlTSUNBTF9QQUdFX01BU0s7Ci0KLQlp ZiAodW5waW4pCi0JCXBpbl9wYWdldGFibGVfcGZuKE1NVUVYVF9VTlBJTl9UQUJMRSwgUEZOX0RP V04ocGEpKTsKLQlDbGVhclBhZ2VQaW5uZWQodmlydF90b19wYWdlKF9fdmEocGEpKSk7Ci0JeGVu X2ZyZWVfcm9fcGFnZXMocGEsIFBBR0VfU0laRSk7Ci19Ci0KLS8qCi0gKiBTaW5jZSBpdCBpcyB3 ZWxsIGlzb2xhdGVkIHdlIGNhbiAoYW5kIHNpbmNlIGl0IGlzIHBlcmhhcHMgbGFyZ2Ugd2Ugc2hv dWxkKQotICogYWxzbyBmcmVlIHRoZSBwYWdlIHRhYmxlcyBtYXBwaW5nIHRoZSBpbml0aWFsIFAt Pk0gdGFibGUuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCB4ZW5fY2xlYW5tZm5tYXAodW5zaWdu ZWQgbG9uZyB2YWRkcikKLXsKLQl1bnNpZ25lZCBsb25nIHZhID0gdmFkZHIgJiBQTURfTUFTSzsK LQl1bnNpZ25lZCBsb25nIHBhOwotCXBnZF90ICpwZ2QgPSBwZ2Rfb2Zmc2V0X2sodmEpOwotCXB1 ZF90ICpwdWRfcGFnZSA9IHB1ZF9vZmZzZXQocGdkLCAwKTsKLQlwdWRfdCAqcHVkOwotCXBtZF90 ICpwbWQ7Ci0JcHRlX3QgKnB0ZTsKLQl1bnNpZ25lZCBpbnQgaTsKLQlib29sIHVucGluOwotCi0J dW5waW4gPSAodmFkZHIgPT0gMiAqIFBHRElSX1NJWkUpOwotCXNldF9wZ2QocGdkLCBfX3BnZCgw KSk7Ci0JZG8gewotCQlwdWQgPSBwdWRfcGFnZSArIHB1ZF9pbmRleCh2YSk7Ci0JCWlmIChwdWRf bm9uZSgqcHVkKSkgewotCQkJdmEgKz0gUFVEX1NJWkU7Ci0JCX0gZWxzZSBpZiAocHVkX2xhcmdl KCpwdWQpKSB7Ci0JCQlwYSA9IHB1ZF92YWwoKnB1ZCkgJiBQSFlTSUNBTF9QQUdFX01BU0s7Ci0J CQl4ZW5fZnJlZV9yb19wYWdlcyhwYSwgUFVEX1NJWkUpOwotCQkJdmEgKz0gUFVEX1NJWkU7Ci0J CX0gZWxzZSB7Ci0JCQlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgdmEpOwotCQkJaWYgKHBtZF9sYXJn ZSgqcG1kKSkgewotCQkJCXBhID0gcG1kX3ZhbCgqcG1kKSAmIFBIWVNJQ0FMX1BBR0VfTUFTSzsK LQkJCQl4ZW5fZnJlZV9yb19wYWdlcyhwYSwgUE1EX1NJWkUpOwotCQkJfSBlbHNlIGlmICghcG1k X25vbmUoKnBtZCkpIHsKLQkJCQlwdGUgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIHZhKTsKLQkJ CQlzZXRfcG1kKHBtZCwgX19wbWQoMCkpOwotCQkJCWZvciAoaSA9IDA7IGkgPCBQVFJTX1BFUl9Q VEU7ICsraSkgewotCQkJCQlpZiAocHRlX25vbmUocHRlW2ldKSkKLQkJCQkJCWJyZWFrOwotCQkJ CQlwYSA9IHB0ZV9wZm4ocHRlW2ldKSA8PCBQQUdFX1NISUZUOwotCQkJCQl4ZW5fZnJlZV9yb19w YWdlcyhwYSwgUEFHRV9TSVpFKTsKLQkJCQl9Ci0JCQkJeGVuX2NsZWFubWZubWFwX2ZyZWVfcGd0 YmwocHRlLCB1bnBpbik7Ci0JCQl9Ci0JCQl2YSArPSBQTURfU0laRTsKLQkJCWlmIChwbWRfaW5k ZXgodmEpKQotCQkJCWNvbnRpbnVlOwotCQkJc2V0X3B1ZChwdWQsIF9fcHVkKDApKTsKLQkJCXhl bl9jbGVhbm1mbm1hcF9mcmVlX3BndGJsKHBtZCwgdW5waW4pOwotCQl9Ci0KLQl9IHdoaWxlIChw dWRfaW5kZXgodmEpIHx8IHBtZF9pbmRleCh2YSkpOwotCXhlbl9jbGVhbm1mbm1hcF9mcmVlX3Bn dGJsKHB1ZF9wYWdlLCB1bnBpbik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB4ZW5fcGFnZXRh YmxlX3AybV9mcmVlKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCXVuc2lnbmVkIGxv bmcgYWRkcjsKLQotCXNpemUgPSBQQUdFX0FMSUdOKHhlbl9zdGFydF9pbmZvLT5ucl9wYWdlcyAq IHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0KLQkvKiBObyBtZW1vcnkgb3IgYWxyZWFkeSBjYWxs ZWQuICovCi0JaWYgKCh1bnNpZ25lZCBsb25nKXhlbl9wMm1fYWRkciA9PSB4ZW5fc3RhcnRfaW5m by0+bWZuX2xpc3QpCi0JCXJldHVybjsKLQotCS8qIHVzaW5nIF9fa2EgYWRkcmVzcyBhbmQgc3Rp Y2tpbmcgSU5WQUxJRF9QMk1fRU5UUlkhICovCi0JbWVtc2V0KCh2b2lkICopeGVuX3N0YXJ0X2lu Zm8tPm1mbl9saXN0LCAweGZmLCBzaXplKTsKLQotCWFkZHIgPSB4ZW5fc3RhcnRfaW5mby0+bWZu X2xpc3Q7Ci0JLyoKLQkgKiBXZSBjb3VsZCBiZSBpbiBfX2thIHNwYWNlLgotCSAqIFdlIHJvdW5k dXAgdG8gdGhlIFBNRCwgd2hpY2ggbWVhbnMgdGhhdCBpZiBhbnlib2R5IGF0IHRoaXMgc3RhZ2Ug aXMKLQkgKiB1c2luZyB0aGUgX19rYSBhZGRyZXNzIG9mIHhlbl9zdGFydF9pbmZvIG9yCi0JICog eGVuX3N0YXJ0X2luZm8tPnNoYXJlZF9pbmZvIHRoZXkgYXJlIGluIGdvaW5nIHRvIGNyYXNoLiBG b3J0dW5hdGx5Ci0JICogd2UgaGF2ZSBhbHJlYWR5IHJldmVjdG9yZWQgaW4geGVuX3NldHVwX2tl cm5lbF9wYWdldGFibGUgYW5kIGluCi0JICogeGVuX3NldHVwX3NoYXJlZF9pbmZvLgotCSAqLwot CXNpemUgPSByb3VuZHVwKHNpemUsIFBNRF9TSVpFKTsKLQotCWlmIChhZGRyID49IF9fU1RBUlRf S0VSTkVMX21hcCkgewotCQl4ZW5fY2xlYW5oaWdobWFwKGFkZHIsIGFkZHIgKyBzaXplKTsKLQkJ c2l6ZSA9IFBBR0VfQUxJR04oeGVuX3N0YXJ0X2luZm8tPm5yX3BhZ2VzICoKLQkJCQkgIHNpemVv Zih1bnNpZ25lZCBsb25nKSk7Ci0JCW1lbWJsb2NrX2ZyZWUoX19wYShhZGRyKSwgc2l6ZSk7Ci0J fSBlbHNlIHsKLQkJeGVuX2NsZWFubWZubWFwKGFkZHIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQg X19pbml0IHhlbl9wYWdldGFibGVfY2xlYW5oaWdobWFwKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9u ZyBzaXplOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQotCS8qIEF0IHRoaXMgc3RhZ2UsIGNsZWFu dXBfaGlnaG1hcCBoYXMgYWxyZWFkeSBjbGVhbmVkIF9fa2Egc3BhY2UKLQkgKiBmcm9tIF9icmtf bGltaXQgd2F5IHVwIHRvIHRoZSBtYXhfcGZuX21hcHBlZCAod2hpY2ggaXMgdGhlIGVuZCBvZgot CSAqIHRoZSByYW1kaXNrKS4gV2UgY29udGludWUgb24sIGVyYXNpbmcgUE1EIGVudHJpZXMgdGhh dCBwb2ludCB0byBwYWdlCi0JICogdGFibGVzIC0gZG8gbm90ZSB0aGF0IHRoZXkgYXJlIGFjY2Vz c2libGUgYXQgdGhpcyBzdGFnZSB2aWEgX192YS4KLQkgKiBGb3IgZ29vZCBtZWFzdXJlIHdlIGFs c28gcm91bmQgdXAgdG8gdGhlIFBNRCAtIHdoaWNoIG1lYW5zIHRoYXQgaWYKLQkgKiBhbnlib2R5 IGlzIHVzaW5nIF9fa2EgYWRkcmVzcyB0byB0aGUgaW5pdGlhbCBib290LXN0YWNrIC0gYW5kIHRy eQotCSAqIHRvIHVzZSBpdCAtIHRoZXkgYXJlIGdvaW5nIHRvIGNyYXNoLiBUaGUgeGVuX3N0YXJ0 X2luZm8gaGFzIGJlZW4KLQkgKiB0YWtlbiBjYXJlIG9mIGFscmVhZHkgaW4geGVuX3NldHVwX2tl cm5lbF9wYWdldGFibGUuICovCi0JYWRkciA9IHhlbl9zdGFydF9pbmZvLT5wdF9iYXNlOwotCXNp emUgPSByb3VuZHVwKHhlbl9zdGFydF9pbmZvLT5ucl9wdF9mcmFtZXMgKiBQQUdFX1NJWkUsIFBN RF9TSVpFKTsKLQotCXhlbl9jbGVhbmhpZ2htYXAoYWRkciwgYWRkciArIHNpemUpOwotCXhlbl9z dGFydF9pbmZvLT5wdF9iYXNlID0gKHVuc2lnbmVkIGxvbmcpX192YShfX3BhKHhlbl9zdGFydF9p bmZvLT5wdF9iYXNlKSk7Ci0jaWZkZWYgREVCVUcKLQkvKiBUaGlzIGlzIHN1cGVyZmx1b3VzIGFu ZCBpcyBub3QgbmVjZXNzYXJ5LCBidXQgeW91IGtub3cgd2hhdAotCSAqIGxldHMgZG8gaXQuIFRo ZSBNT0RVTEVTX1ZBRERSIC0+IE1PRFVMRVNfRU5EIHNob3VsZCBiZSBjbGVhciBvZgotCSAqIGFu eXRoaW5nIGF0IHRoaXMgc3RhZ2UuICovCi0JeGVuX2NsZWFuaGlnaG1hcChNT0RVTEVTX1ZBRERS LCByb3VuZHVwKE1PRFVMRVNfVkFERFIsIFBVRF9TSVpFKSAtIDEpOwotI2VuZGlmCi19Ci0jZW5k aWYKLQotc3RhdGljIHZvaWQgX19pbml0IHhlbl9wYWdldGFibGVfcDJtX3NldHVwKHZvaWQpCi17 Ci0JaWYgKHhlbl9mZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVkX3BoeXNtYXApKQotCQly ZXR1cm47Ci0KLQl4ZW5fdm1hbGxvY19wMm1fdHJlZSgpOwotCi0jaWZkZWYgQ09ORklHX1g4Nl82 NAotCXhlbl9wYWdldGFibGVfcDJtX2ZyZWUoKTsKLQotCXhlbl9wYWdldGFibGVfY2xlYW5oaWdo bWFwKCk7Ci0jZW5kaWYKLQkvKiBBbmQgcmV2ZWN0b3IhIEJ5ZSBieWUgb2xkIGFycmF5ICovCi0J eGVuX3N0YXJ0X2luZm8tPm1mbl9saXN0ID0gKHVuc2lnbmVkIGxvbmcpeGVuX3AybV9hZGRyOwot fQotCi1zdGF0aWMgdm9pZCBfX2luaXQgeGVuX3BhZ2V0YWJsZV9pbml0KHZvaWQpCi17Ci0JcGFn aW5nX2luaXQoKTsKLQl4ZW5fcG9zdF9hbGxvY2F0b3JfaW5pdCgpOwotCi0JeGVuX3BhZ2V0YWJs ZV9wMm1fc2V0dXAoKTsKLQotCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRvcCBhbmQgbWlk IG1mbiBsZXZlbHMgZm9yIHAybSBzdHJ1Y3R1cmUgKi8KLQl4ZW5fYnVpbGRfbWZuX2xpc3RfbGlz dCgpOwotCi0JLyogUmVtYXAgbWVtb3J5IGZyZWVkIGR1ZSB0byBjb25mbGljdHMgd2l0aCBFODIw IG1hcCAqLwotCWlmICgheGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21h cCkpCi0JCXhlbl9yZW1hcF9tZW1vcnkoKTsKLQotI2lmZGVmIENPTkZJR19YRU5fUFYKLQl4ZW5f c2V0dXBfc2hhcmVkX2luZm8oKTsKLSNlbmRpZgotfQotc3RhdGljIHZvaWQgeGVuX3dyaXRlX2Ny Mih1bnNpZ25lZCBsb25nIGNyMikKLXsKLQl0aGlzX2NwdV9yZWFkKHhlbl92Y3B1KS0+YXJjaC5j cjIgPSBjcjI7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHhlbl9yZWFkX2NyMih2b2lkKQot ewotCXJldHVybiB0aGlzX2NwdV9yZWFkKHhlbl92Y3B1KS0+YXJjaC5jcjI7Ci19Ci0KLXVuc2ln bmVkIGxvbmcgeGVuX3JlYWRfY3IyX2RpcmVjdCh2b2lkKQotewotCXJldHVybiB0aGlzX2NwdV9y ZWFkKHhlbl92Y3B1X2luZm8uYXJjaC5jcjIpOwotfQotCi12b2lkIHhlbl9mbHVzaF90bGJfYWxs KHZvaWQpCi17Ci0Jc3RydWN0IG1tdWV4dF9vcCAqb3A7Ci0Jc3RydWN0IG11bHRpY2FsbF9zcGFj ZSBtY3M7Ci0KLQl0cmFjZV94ZW5fbW11X2ZsdXNoX3RsYl9hbGwoMCk7Ci0KLQlwcmVlbXB0X2Rp c2FibGUoKTsKLQotCW1jcyA9IHhlbl9tY19lbnRyeShzaXplb2YoKm9wKSk7Ci0KLQlvcCA9IG1j cy5hcmdzOwotCW9wLT5jbWQgPSBNTVVFWFRfVExCX0ZMVVNIX0FMTDsKLQlNVUxUSV9tbXVleHRf b3AobWNzLm1jLCBvcCwgMSwgTlVMTCwgRE9NSURfU0VMRik7Ci0KLQl4ZW5fbWNfaXNzdWUoUEFS QVZJUlRfTEFaWV9NTVUpOwotCi0JcHJlZW1wdF9lbmFibGUoKTsKLX0KLXN0YXRpYyB2b2lkIHhl bl9mbHVzaF90bGIodm9pZCkKLXsKLQlzdHJ1Y3QgbW11ZXh0X29wICpvcDsKLQlzdHJ1Y3QgbXVs dGljYWxsX3NwYWNlIG1jczsKLQotCXRyYWNlX3hlbl9tbXVfZmx1c2hfdGxiKDApOwotCi0JcHJl ZW1wdF9kaXNhYmxlKCk7Ci0KLQltY3MgPSB4ZW5fbWNfZW50cnkoc2l6ZW9mKCpvcCkpOwotCi0J b3AgPSBtY3MuYXJnczsKLQlvcC0+Y21kID0gTU1VRVhUX1RMQl9GTFVTSF9MT0NBTDsKLQlNVUxU SV9tbXVleHRfb3AobWNzLm1jLCBvcCwgMSwgTlVMTCwgRE9NSURfU0VMRik7Ci0KLQl4ZW5fbWNf aXNzdWUoUEFSQVZJUlRfTEFaWV9NTVUpOwotCi0JcHJlZW1wdF9lbmFibGUoKTsKLX0KLQotc3Rh dGljIHZvaWQgeGVuX2ZsdXNoX3RsYl9zaW5nbGUodW5zaWduZWQgbG9uZyBhZGRyKQotewotCXN0 cnVjdCBtbXVleHRfb3AgKm9wOwotCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzOwotCi0JdHJh Y2VfeGVuX21tdV9mbHVzaF90bGJfc2luZ2xlKGFkZHIpOwotCi0JcHJlZW1wdF9kaXNhYmxlKCk7 Ci0KLQltY3MgPSB4ZW5fbWNfZW50cnkoc2l6ZW9mKCpvcCkpOwotCW9wID0gbWNzLmFyZ3M7Ci0J b3AtPmNtZCA9IE1NVUVYVF9JTlZMUEdfTE9DQUw7Ci0Jb3AtPmFyZzEubGluZWFyX2FkZHIgPSBh ZGRyICYgUEFHRV9NQVNLOwotCU1VTFRJX21tdWV4dF9vcChtY3MubWMsIG9wLCAxLCBOVUxMLCBE T01JRF9TRUxGKTsKLQotCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX01NVSk7Ci0KLQlwcmVl bXB0X2VuYWJsZSgpOwotfQotCi1zdGF0aWMgdm9pZCB4ZW5fZmx1c2hfdGxiX290aGVycyhjb25z dCBzdHJ1Y3QgY3B1bWFzayAqY3B1cywKLQkJCQkgc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2ln bmVkIGxvbmcgc3RhcnQsCi0JCQkJIHVuc2lnbmVkIGxvbmcgZW5kKQotewotCXN0cnVjdCB7Ci0J CXN0cnVjdCBtbXVleHRfb3Agb3A7Ci0jaWZkZWYgQ09ORklHX1NNUAotCQlERUNMQVJFX0JJVE1B UChtYXNrLCBudW1fcHJvY2Vzc29ycyk7Ci0jZWxzZQotCQlERUNMQVJFX0JJVE1BUChtYXNrLCBO Ul9DUFVTKTsKLSNlbmRpZgotCX0gKmFyZ3M7Ci0Jc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7 Ci0KLQl0cmFjZV94ZW5fbW11X2ZsdXNoX3RsYl9vdGhlcnMoY3B1cywgbW0sIHN0YXJ0LCBlbmQp OwotCi0JaWYgKGNwdW1hc2tfZW1wdHkoY3B1cykpCi0JCXJldHVybjsJCS8qIG5vdGhpbmcgdG8g ZG8gKi8KLQotCW1jcyA9IHhlbl9tY19lbnRyeShzaXplb2YoKmFyZ3MpKTsKLQlhcmdzID0gbWNz LmFyZ3M7Ci0JYXJncy0+b3AuYXJnMi52Y3B1bWFzayA9IHRvX2NwdW1hc2soYXJncy0+bWFzayk7 Ci0KLQkvKiBSZW1vdmUgdXMsIGFuZCBhbnkgb2ZmbGluZSBDUFVTLiAqLwotCWNwdW1hc2tfYW5k KHRvX2NwdW1hc2soYXJncy0+bWFzayksIGNwdXMsIGNwdV9vbmxpbmVfbWFzayk7Ci0JY3B1bWFz a19jbGVhcl9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpLCB0b19jcHVtYXNrKGFyZ3MtPm1hc2spKTsK LQotCWFyZ3MtPm9wLmNtZCA9IE1NVUVYVF9UTEJfRkxVU0hfTVVMVEk7Ci0JaWYgKGVuZCAhPSBU TEJfRkxVU0hfQUxMICYmIChlbmQgLSBzdGFydCkgPD0gUEFHRV9TSVpFKSB7Ci0JCWFyZ3MtPm9w LmNtZCA9IE1NVUVYVF9JTlZMUEdfTVVMVEk7Ci0JCWFyZ3MtPm9wLmFyZzEubGluZWFyX2FkZHIg PSBzdGFydDsKLQl9Ci0KLQlNVUxUSV9tbXVleHRfb3AobWNzLm1jLCAmYXJncy0+b3AsIDEsIE5V TEwsIERPTUlEX1NFTEYpOwotCi0JeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfTU1VKTsKLX0K LQotc3RhdGljIHVuc2lnbmVkIGxvbmcgeGVuX3JlYWRfY3IzKHZvaWQpCi17Ci0JcmV0dXJuIHRo aXNfY3B1X3JlYWQoeGVuX2NyMyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9jdXJyZW50X2NyMyh2 b2lkICp2KQotewotCXRoaXNfY3B1X3dyaXRlKHhlbl9jdXJyZW50X2NyMywgKHVuc2lnbmVkIGxv bmcpdik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9feGVuX3dyaXRlX2NyMyhib29sIGtlcm5lbCwgdW5z aWduZWQgbG9uZyBjcjMpCi17Ci0Jc3RydWN0IG1tdWV4dF9vcCBvcDsKLQl1bnNpZ25lZCBsb25n IG1mbjsKLQotCXRyYWNlX3hlbl9tbXVfd3JpdGVfY3IzKGtlcm5lbCwgY3IzKTsKLQotCWlmIChj cjMpCi0JCW1mbiA9IHBmbl90b19tZm4oUEZOX0RPV04oY3IzKSk7Ci0JZWxzZQotCQltZm4gPSAw OwotCi0JV0FSTl9PTihtZm4gPT0gMCAmJiBrZXJuZWwpOwotCi0Jb3AuY21kID0ga2VybmVsID8g TU1VRVhUX05FV19CQVNFUFRSIDogTU1VRVhUX05FV19VU0VSX0JBU0VQVFI7Ci0Jb3AuYXJnMS5t Zm4gPSBtZm47Ci0KLQl4ZW5fZXh0ZW5kX21tdWV4dF9vcCgmb3ApOwotCi0JaWYgKGtlcm5lbCkg ewotCQl0aGlzX2NwdV93cml0ZSh4ZW5fY3IzLCBjcjMpOwotCi0JCS8qIFVwZGF0ZSB4ZW5fY3Vy cmVudF9jcjMgb25jZSB0aGUgYmF0Y2ggaGFzIGFjdHVhbGx5Ci0JCSAgIGJlZW4gc3VibWl0dGVk LiAqLwotCQl4ZW5fbWNfY2FsbGJhY2soc2V0X2N1cnJlbnRfY3IzLCAodm9pZCAqKWNyMyk7Ci0J fQotfQotc3RhdGljIHZvaWQgeGVuX3dyaXRlX2NyMyh1bnNpZ25lZCBsb25nIGNyMykKLXsKLQlC VUdfT04ocHJlZW1wdGlibGUoKSk7Ci0KLQl4ZW5fbWNfYmF0Y2goKTsgIC8qIGRpc2FibGVzIGlu dGVycnVwdHMgKi8KLQotCS8qIFVwZGF0ZSB3aGlsZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwg c28gaXRzIGF0b21pYyB3aXRoCi0JICAgcmVzcGVjdCB0byBpcGlzICovCi0JdGhpc19jcHVfd3Jp dGUoeGVuX2NyMywgY3IzKTsKLQotCV9feGVuX3dyaXRlX2NyMyh0cnVlLCBjcjMpOwotCi0jaWZk ZWYgQ09ORklHX1g4Nl82NAotCXsKLQkJcGdkX3QgKnVzZXJfcGdkID0geGVuX2dldF91c2VyX3Bn ZChfX3ZhKGNyMykpOwotCQlpZiAodXNlcl9wZ2QpCi0JCQlfX3hlbl93cml0ZV9jcjMoZmFsc2Us IF9fcGEodXNlcl9wZ2QpKTsKLQkJZWxzZQotCQkJX194ZW5fd3JpdGVfY3IzKGZhbHNlLCAwKTsK LQl9Ci0jZW5kaWYKLQotCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX0NQVSk7ICAvKiBpbnRl cnJ1cHRzIHJlc3RvcmVkICovCi19Ci0KLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0vKgotICogQXQg dGhlIHN0YXJ0IG9mIHRoZSBkYXkgLSB3aGVuIFhlbiBsYXVuY2hlcyBhIGd1ZXN0LCBpdCBoYXMg YWxyZWFkeQotICogYnVpbHQgcGFnZXRhYmxlcyBmb3IgdGhlIGd1ZXN0LiBXZSBkaWxpZ2VudGx5 IGxvb2sgb3ZlciB0aGVtCi0gKiBpbiB4ZW5fc2V0dXBfa2VybmVsX3BhZ2V0YWJsZSBhbmQgZ3Jh ZnQgYXMgYXBwcm9wcmlhdGUgdGhlbSBpbiB0aGUKLSAqIGluaXRfbGV2ZWw0X3BndCBhbmQgaXRz IGZyaWVuZHMuIFRoZW4gd2hlbiB3ZSBhcmUgaGFwcHkgd2UgbG9hZAotICogdGhlIG5ldyBpbml0 X2xldmVsNF9wZ3QgLSBhbmQgY29udGludWUgb24uCi0gKgotICogVGhlIGdlbmVyaWMgY29kZSBz dGFydHMgKHN0YXJ0X2tlcm5lbCkgYW5kICdpbml0X21lbV9tYXBwaW5nJyBzZXRzCi0gKiB1cCB0 aGUgcmVzdCBvZiB0aGUgcGFnZXRhYmxlcy4gV2hlbiBpdCBoYXMgY29tcGxldGVkIGl0IGxvYWRz IHRoZSBjcjMuCi0gKiBOLkIuIHRoYXQgYmFyZW1ldGFsIHdvdWxkIHN0YXJ0IGF0ICdzdGFydF9r ZXJuZWwnIChhbmQgdGhlIGVhcmx5Ci0gKiAjUEYgaGFuZGxlciB3b3VsZCBjcmVhdGUgYm9vdHN0 cmFwIHBhZ2V0YWJsZXMpIC0gc28gd2UgYXJlIHJ1bm5pbmcKLSAqIHdpdGggdGhlIHNhbWUgYXNz dW1wdGlvbnMgYXMgd2hhdCB0byBkbyB3aGVuIHdyaXRlX2NyMyBpcyBleGVjdXRlZAotICogYXQg dGhpcyBwb2ludC4KLSAqCi0gKiBTaW5jZSB0aGVyZSBhcmUgbm8gdXNlci1wYWdlIHRhYmxlcyBh dCBhbGwsIHdlIGhhdmUgdHdvIHZhcmlhbnRzCi0gKiBvZiB4ZW5fd3JpdGVfY3IzIC0gdGhlIGVh cmx5IGJvb3R1cCAodGhpcyBvbmUpLCBhbmQgdGhlIGxhdGUgb25lCi0gKiAoeGVuX3dyaXRlX2Ny MykuIFRoZSByZWFzb24gd2UgaGF2ZSB0byBkbyB0aGF0IGlzIHRoYXQgaW4gNjQtYml0Ci0gKiB0 aGUgTGludXgga2VybmVsIGFuZCB1c2VyLXNwYWNlIGFyZSBib3RoIGluIHJpbmcgMyB3aGlsZSB0 aGUKLSAqIGh5cGVydmlzb3IgaXMgaW4gcmluZyAwLgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQg eGVuX3dyaXRlX2NyM19pbml0KHVuc2lnbmVkIGxvbmcgY3IzKQotewotCUJVR19PTihwcmVlbXB0 aWJsZSgpKTsKLQotCXhlbl9tY19iYXRjaCgpOyAgLyogZGlzYWJsZXMgaW50ZXJydXB0cyAqLwot Ci0JLyogVXBkYXRlIHdoaWxlIGludGVycnVwdHMgYXJlIGRpc2FibGVkLCBzbyBpdHMgYXRvbWlj IHdpdGgKLQkgICByZXNwZWN0IHRvIGlwaXMgKi8KLQl0aGlzX2NwdV93cml0ZSh4ZW5fY3IzLCBj cjMpOwotCi0JX194ZW5fd3JpdGVfY3IzKHRydWUsIGNyMyk7Ci0KLQl4ZW5fbWNfaXNzdWUoUEFS QVZJUlRfTEFaWV9DUFUpOyAgLyogaW50ZXJydXB0cyByZXN0b3JlZCAqLwotfQotI2VuZGlmCi0K LXN0YXRpYyBpbnQgeGVuX3BnZF9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKLXsKLQlwZ2Rf dCAqcGdkID0gbW0tPnBnZDsKLQlpbnQgcmV0ID0gMDsKLQotCUJVR19PTihQYWdlUGlubmVkKHZp cnRfdG9fcGFnZShwZ2QpKSk7Ci0KLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JewotCQlzdHJ1Y3Qg cGFnZSAqcGFnZSA9IHZpcnRfdG9fcGFnZShwZ2QpOwotCQlwZ2RfdCAqdXNlcl9wZ2Q7Ci0KLQkJ QlVHX09OKHBhZ2UtPnByaXZhdGUgIT0gMCk7Ci0KLQkJcmV0ID0gLUVOT01FTTsKLQotCQl1c2Vy X3BnZCA9IChwZ2RfdCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7 Ci0JCXBhZ2UtPnByaXZhdGUgPSAodW5zaWduZWQgbG9uZyl1c2VyX3BnZDsKLQotCQlpZiAodXNl cl9wZ2QgIT0gTlVMTCkgewotI2lmZGVmIENPTkZJR19YODZfVlNZU0NBTExfRU1VTEFUSU9OCi0J CQl1c2VyX3BnZFtwZ2RfaW5kZXgoVlNZU0NBTExfQUREUildID0KLQkJCQlfX3BnZChfX3BhKGxl dmVsM191c2VyX3ZzeXNjYWxsKSB8IF9QQUdFX1RBQkxFKTsKLSNlbmRpZgotCQkJcmV0ID0gMDsK LQkJfQotCi0JCUJVR19PTihQYWdlUGlubmVkKHZpcnRfdG9fcGFnZSh4ZW5fZ2V0X3VzZXJfcGdk KHBnZCkpKSk7Ci0JfQotI2VuZGlmCi0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCB4 ZW5fcGdkX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QpCi17Ci0jaWZkZWYg Q09ORklHX1g4Nl82NAotCXBnZF90ICp1c2VyX3BnZCA9IHhlbl9nZXRfdXNlcl9wZ2QocGdkKTsK LQotCWlmICh1c2VyX3BnZCkKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXVzZXJfcGdkKTsK LSNlbmRpZgotfQotCi0vKgotICogSW5pdC10aW1lIHNldF9wdGUgd2hpbGUgY29uc3RydWN0aW5n IGluaXRpYWwgcGFnZXRhYmxlcywgd2hpY2gKLSAqIGRvZXNuJ3QgYWxsb3cgUk8gcGFnZSB0YWJs ZSBwYWdlcyB0byBiZSByZW1hcHBlZCBSVy4KLSAqCi0gKiBJZiB0aGVyZSBpcyBubyBNRk4gZm9y IHRoaXMgUEZOIHRoZW4gdGhpcyBwYWdlIGlzIGluaXRpYWxseQotICogYmFsbG9vbmVkIG91dCBz byBjbGVhciB0aGUgUFRFIChhcyBpbiBkZWNyZWFzZV9yZXNlcnZhdGlvbigpIGluCi0gKiBkcml2 ZXJzL3hlbi9iYWxsb29uLmMpLgotICoKLSAqIE1hbnkgb2YgdGhlc2UgUFRFIHVwZGF0ZXMgYXJl IGRvbmUgb24gdW5waW5uZWQgYW5kIHdyaXRhYmxlIHBhZ2VzCi0gKiBhbmQgZG9pbmcgYSBoeXBl cmNhbGwgZm9yIHRoZXNlIGlzIHVubmVjZXNzYXJ5IGFuZCBleHBlbnNpdmUuICBBdAotICogdGhp cyBwb2ludCBpdCBpcyBub3QgcG9zc2libGUgdG8gdGVsbCBpZiBhIHBhZ2UgaXMgcGlubmVkIG9y IG5vdCwKLSAqIHNvIGFsd2F5cyB3cml0ZSB0aGUgUFRFIGRpcmVjdGx5IGFuZCByZWx5IG9uIFhl biB0cmFwcGluZyBhbmQKLSAqIGVtdWxhdGluZyBhbnkgdXBkYXRlcyBhcyBuZWNlc3NhcnkuCi0g Ki8KLV9fdmlzaWJsZSBwdGVfdCB4ZW5fbWFrZV9wdGVfaW5pdChwdGV2YWxfdCBwdGUpCi17Ci0j aWZkZWYgQ09ORklHX1g4Nl82NAotCXVuc2lnbmVkIGxvbmcgcGZuOwotCi0JLyoKLQkgKiBQYWdl cyBiZWxvbmdpbmcgdG8gdGhlIGluaXRpYWwgcDJtIGxpc3QgbWFwcGVkIG91dHNpZGUgdGhlIGRl ZmF1bHQKLQkgKiBhZGRyZXNzIHJhbmdlIG11c3QgYmUgbWFwcGVkIHJlYWQtb25seS4gVGhpcyBy ZWdpb24gY29udGFpbnMgdGhlCi0JICogcGFnZSB0YWJsZXMgZm9yIG1hcHBpbmcgdGhlIHAybSBs aXN0LCB0b28sIGFuZCBwYWdlIHRhYmxlcyBNVVNUIGJlCi0JICogbWFwcGVkIHJlYWQtb25seS4K LQkgKi8KLQlwZm4gPSAocHRlICYgUFRFX1BGTl9NQVNLKSA+PiBQQUdFX1NISUZUOwotCWlmICh4 ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3QgPCBfX1NUQVJUX0tFUk5FTF9tYXAgJiYKLQkgICAgcGZu ID49IHhlbl9zdGFydF9pbmZvLT5maXJzdF9wMm1fcGZuICYmCi0JICAgIHBmbiA8IHhlbl9zdGFy dF9pbmZvLT5maXJzdF9wMm1fcGZuICsgeGVuX3N0YXJ0X2luZm8tPm5yX3AybV9mcmFtZXMpCi0J CXB0ZSAmPSB+X1BBR0VfUlc7Ci0jZW5kaWYKLQlwdGUgPSBwdGVfcGZuX3RvX21mbihwdGUpOwot CXJldHVybiBuYXRpdmVfbWFrZV9wdGUocHRlKTsKLX0KLVBWX0NBTExFRV9TQVZFX1JFR1NfVEhV TksoeGVuX21ha2VfcHRlX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgeGVuX3NldF9wdGVf aW5pdChwdGVfdCAqcHRlcCwgcHRlX3QgcHRlKQotewotI2lmZGVmIENPTkZJR19YODZfMzIKLQkv KiBJZiB0aGVyZSdzIGFuIGV4aXN0aW5nIHB0ZSwgdGhlbiBkb24ndCBhbGxvdyBfUEFHRV9SVyB0 byBiZSBzZXQgKi8KLQlpZiAocHRlX21mbihwdGUpICE9IElOVkFMSURfUDJNX0VOVFJZCi0JICAg ICYmIHB0ZV92YWxfbWEoKnB0ZXApICYgX1BBR0VfUFJFU0VOVCkKLQkJcHRlID0gX19wdGVfbWEo KChwdGVfdmFsX21hKCpwdGVwKSAmIF9QQUdFX1JXKSB8IH5fUEFHRV9SVykgJgotCQkJICAgICAg IHB0ZV92YWxfbWEocHRlKSk7Ci0jZW5kaWYKLQluYXRpdmVfc2V0X3B0ZShwdGVwLCBwdGUpOwot fQotCi0vKiBFYXJseSBpbiBib290LCB3aGlsZSBzZXR0aW5nIHVwIHRoZSBpbml0aWFsIHBhZ2V0 YWJsZSwgYXNzdW1lCi0gICBldmVyeXRoaW5nIGlzIHBpbm5lZC4gKi8KLXN0YXRpYyB2b2lkIF9f aW5pdCB4ZW5fYWxsb2NfcHRlX2luaXQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxv bmcgcGZuKQotewotI2lmZGVmIENPTkZJR19GTEFUTUVNCi0JQlVHX09OKG1lbV9tYXApOwkvKiBz aG91bGQgb25seSBiZSB1c2VkIGVhcmx5ICovCi0jZW5kaWYKLQltYWtlX2xvd21lbV9wYWdlX3Jl YWRvbmx5KF9fdmEoUEZOX1BIWVMocGZuKSkpOwotCXBpbl9wYWdldGFibGVfcGZuKE1NVUVYVF9Q SU5fTDFfVEFCTEUsIHBmbik7Ci19Ci0KLS8qIFVzZWQgZm9yIHBtZCBhbmQgcHVkICovCi1zdGF0 aWMgdm9pZCBfX2luaXQgeGVuX2FsbG9jX3BtZF9pbml0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1 bnNpZ25lZCBsb25nIHBmbikKLXsKLSNpZmRlZiBDT05GSUdfRkxBVE1FTQotCUJVR19PTihtZW1f bWFwKTsJLyogc2hvdWxkIG9ubHkgYmUgdXNlZCBlYXJseSAqLwotI2VuZGlmCi0JbWFrZV9sb3dt ZW1fcGFnZV9yZWFkb25seShfX3ZhKFBGTl9QSFlTKHBmbikpKTsKLX0KLQotLyogRWFybHkgcmVs ZWFzZV9wdGUgYXNzdW1lcyB0aGF0IGFsbCBwdHMgYXJlIHBpbm5lZCwgc2luY2UgdGhlcmUncwot ICAgb25seSBpbml0X21tIGFuZCBhbnl0aGluZyBhdHRhY2hlZCB0byB0aGF0IGlzIHBpbm5lZC4g Ki8KLXN0YXRpYyB2b2lkIF9faW5pdCB4ZW5fcmVsZWFzZV9wdGVfaW5pdCh1bnNpZ25lZCBsb25n IHBmbikKLXsKLQlwaW5fcGFnZXRhYmxlX3BmbihNTVVFWFRfVU5QSU5fVEFCTEUsIHBmbik7Ci0J bWFrZV9sb3dtZW1fcGFnZV9yZWFkd3JpdGUoX192YShQRk5fUEhZUyhwZm4pKSk7Ci19Ci0KLXN0 YXRpYyB2b2lkIF9faW5pdCB4ZW5fcmVsZWFzZV9wbWRfaW5pdCh1bnNpZ25lZCBsb25nIHBmbikK LXsKLQltYWtlX2xvd21lbV9wYWdlX3JlYWR3cml0ZShfX3ZhKFBGTl9QSFlTKHBmbikpKTsKLX0K LQotc3RhdGljIGlubGluZSB2b2lkIF9fcGluX3BhZ2V0YWJsZV9wZm4odW5zaWduZWQgY21kLCB1 bnNpZ25lZCBsb25nIHBmbikKLXsKLQlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jczsKLQlzdHJ1 Y3QgbW11ZXh0X29wICpvcDsKLQotCW1jcyA9IF9feGVuX21jX2VudHJ5KHNpemVvZigqb3ApKTsK LQlvcCA9IG1jcy5hcmdzOwotCW9wLT5jbWQgPSBjbWQ7Ci0Jb3AtPmFyZzEubWZuID0gcGZuX3Rv X21mbihwZm4pOwotCi0JTVVMVElfbW11ZXh0X29wKG1jcy5tYywgbWNzLmFyZ3MsIDEsIE5VTEws IERPTUlEX1NFTEYpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19zZXRfcGZuX3Byb3QodW5z aWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCi17Ci0Jc3RydWN0IG11bHRpY2FsbF9zcGFj ZSBtY3M7Ci0JdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpX192YShwZm4gPDwg UEFHRV9TSElGVCk7Ci0KLQltY3MgPSBfX3hlbl9tY19lbnRyeSgwKTsKLQlNVUxUSV91cGRhdGVf dmFfbWFwcGluZyhtY3MubWMsICh1bnNpZ25lZCBsb25nKWFkZHIsCi0JCQkJcGZuX3B0ZShwZm4s IHByb3QpLCAwKTsKLX0KLQotLyogVGhpcyBuZWVkcyB0byBtYWtlIHN1cmUgdGhlIG5ldyBwdGUg cGFnZSBpcyBwaW5uZWQgaWZmIGl0cyBiZWluZwotICAgYXR0YWNoZWQgdG8gYSBwaW5uZWQgcGFn ZXRhYmxlLiAqLwotc3RhdGljIGlubGluZSB2b2lkIHhlbl9hbGxvY19wdHBhZ2Uoc3RydWN0IG1t X3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcGZuLAotCQkJCSAgICB1bnNpZ25lZCBsZXZlbCkK LXsKLQlib29sIHBpbm5lZCA9IFBhZ2VQaW5uZWQodmlydF90b19wYWdlKG1tLT5wZ2QpKTsKLQot CXRyYWNlX3hlbl9tbXVfYWxsb2NfcHRwYWdlKG1tLCBwZm4sIGxldmVsLCBwaW5uZWQpOwotCi0J aWYgKHBpbm5lZCkgewotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBmbl90b19wYWdlKHBmbik7Ci0K LQkJU2V0UGFnZVBpbm5lZChwYWdlKTsKLQotCQlpZiAoIVBhZ2VIaWdoTWVtKHBhZ2UpKSB7Ci0J CQl4ZW5fbWNfYmF0Y2goKTsKLQotCQkJX19zZXRfcGZuX3Byb3QocGZuLCBQQUdFX0tFUk5FTF9S Tyk7Ci0KLQkJCWlmIChsZXZlbCA9PSBQVF9QVEUgJiYgVVNFX1NQTElUX1BURV9QVExPQ0tTKQot CQkJCV9fcGluX3BhZ2V0YWJsZV9wZm4oTU1VRVhUX1BJTl9MMV9UQUJMRSwgcGZuKTsKLQotCQkJ eGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfTU1VKTsKLQkJfSBlbHNlIHsKLQkJCS8qIG1ha2Ug c3VyZSB0aGVyZSBhcmUgbm8gc3RyYXkgbWFwcGluZ3Mgb2YKLQkJCSAgIHRoaXMgcGFnZSAqLwot CQkJa21hcF9mbHVzaF91bnVzZWQoKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgeGVuX2Fs bG9jX3B0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBwZm4pCi17Ci0JeGVu X2FsbG9jX3B0cGFnZShtbSwgcGZuLCBQVF9QVEUpOwotfQotCi1zdGF0aWMgdm9pZCB4ZW5fYWxs b2NfcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHBmbikKLXsKLQl4ZW5f YWxsb2NfcHRwYWdlKG1tLCBwZm4sIFBUX1BNRCk7Ci19Ci0KLS8qIFRoaXMgc2hvdWxkIG5ldmVy IGhhcHBlbiB1bnRpbCB3ZSdyZSBPSyB0byB1c2Ugc3RydWN0IHBhZ2UgKi8KLXN0YXRpYyBpbmxp bmUgdm9pZCB4ZW5fcmVsZWFzZV9wdHBhZ2UodW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxl dmVsKQotewotCXN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKLQlib29sIHBp bm5lZCA9IFBhZ2VQaW5uZWQocGFnZSk7Ci0KLQl0cmFjZV94ZW5fbW11X3JlbGVhc2VfcHRwYWdl KHBmbiwgbGV2ZWwsIHBpbm5lZCk7Ci0KLQlpZiAocGlubmVkKSB7Ci0JCWlmICghUGFnZUhpZ2hN ZW0ocGFnZSkpIHsKLQkJCXhlbl9tY19iYXRjaCgpOwotCi0JCQlpZiAobGV2ZWwgPT0gUFRfUFRF ICYmIFVTRV9TUExJVF9QVEVfUFRMT0NLUykKLQkJCQlfX3Bpbl9wYWdldGFibGVfcGZuKE1NVUVY VF9VTlBJTl9UQUJMRSwgcGZuKTsKLQotCQkJX19zZXRfcGZuX3Byb3QocGZuLCBQQUdFX0tFUk5F TCk7Ci0KLQkJCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX01NVSk7Ci0JCX0KLQkJQ2xlYXJQ YWdlUGlubmVkKHBhZ2UpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgeGVuX3JlbGVhc2VfcHRlKHVu c2lnbmVkIGxvbmcgcGZuKQotewotCXhlbl9yZWxlYXNlX3B0cGFnZShwZm4sIFBUX1BURSk7Ci19 Ci0KLXN0YXRpYyB2b2lkIHhlbl9yZWxlYXNlX3BtZCh1bnNpZ25lZCBsb25nIHBmbikKLXsKLQl4 ZW5fcmVsZWFzZV9wdHBhZ2UocGZuLCBQVF9QTUQpOwotfQotCi0jaWYgQ09ORklHX1BHVEFCTEVf TEVWRUxTID09IDQKLXN0YXRpYyB2b2lkIHhlbl9hbGxvY19wdWQoc3RydWN0IG1tX3N0cnVjdCAq bW0sIHVuc2lnbmVkIGxvbmcgcGZuKQotewotCXhlbl9hbGxvY19wdHBhZ2UobW0sIHBmbiwgUFRf UFVEKTsKLX0KLQotc3RhdGljIHZvaWQgeGVuX3JlbGVhc2VfcHVkKHVuc2lnbmVkIGxvbmcgcGZu KQotewotCXhlbl9yZWxlYXNlX3B0cGFnZShwZm4sIFBUX1BVRCk7Ci19Ci0jZW5kaWYKLQotdm9p ZCBfX2luaXQgeGVuX3Jlc2VydmVfdG9wKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX1g4Nl8zMgot CXVuc2lnbmVkIGxvbmcgdG9wID0gSFlQRVJWSVNPUl9WSVJUX1NUQVJUOwotCXN0cnVjdCB4ZW5f cGxhdGZvcm1fcGFyYW1ldGVycyBwcDsKLQotCWlmIChIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhF TlZFUl9wbGF0Zm9ybV9wYXJhbWV0ZXJzLCAmcHApID09IDApCi0JCXRvcCA9IHBwLnZpcnRfc3Rh cnQ7Ci0KLQlyZXNlcnZlX3RvcF9hZGRyZXNzKC10b3ApOwotI2VuZGlmCS8qIENPTkZJR19YODZf MzIgKi8KLX0KLQotLyoKLSAqIExpa2UgX192YSgpLCBidXQgcmV0dXJucyBhZGRyZXNzIGluIHRo ZSBrZXJuZWwgbWFwcGluZyAod2hpY2ggaXMKLSAqIGFsbCB3ZSBoYXZlIHVudGlsIHRoZSBwaHlz aWNhbCBtZW1vcnkgbWFwcGluZyBoYXMgYmVlbiBzZXQgdXAuCi0gKi8KLXN0YXRpYyB2b2lkICog X19pbml0IF9fa2EocGh5c19hZGRyX3QgcGFkZHIpCi17Ci0jaWZkZWYgQ09ORklHX1g4Nl82NAot CXJldHVybiAodm9pZCAqKShwYWRkciArIF9fU1RBUlRfS0VSTkVMX21hcCk7Ci0jZWxzZQotCXJl dHVybiBfX3ZhKHBhZGRyKTsKLSNlbmRpZgotfQotCi0vKiBDb252ZXJ0IGEgbWFjaGluZSBhZGRy ZXNzIHRvIHBoeXNpY2FsIGFkZHJlc3MgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBt MnAocGh5c19hZGRyX3QgbWFkZHIpCi17Ci0JcGh5c19hZGRyX3QgcGFkZHI7Ci0KLQltYWRkciAm PSBQVEVfUEZOX01BU0s7Ci0JcGFkZHIgPSBtZm5fdG9fcGZuKG1hZGRyID4+IFBBR0VfU0hJRlQp IDw8IFBBR0VfU0hJRlQ7Ci0KLQlyZXR1cm4gcGFkZHI7Ci19Ci0KLS8qIENvbnZlcnQgYSBtYWNo aW5lIGFkZHJlc3MgdG8ga2VybmVsIHZpcnR1YWwgKi8KLXN0YXRpYyB2b2lkICogX19pbml0IG0y dihwaHlzX2FkZHJfdCBtYWRkcikKLXsKLQlyZXR1cm4gX19rYShtMnAobWFkZHIpKTsKLX0KLQot LyogU2V0IHRoZSBwYWdlIHBlcm1pc3Npb25zIG9uIGFuIGlkZW50aXR5LW1hcHBlZCBwYWdlcyAq Lwotc3RhdGljIHZvaWQgX19pbml0IHNldF9wYWdlX3Byb3RfZmxhZ3Modm9pZCAqYWRkciwgcGdw cm90X3QgcHJvdCwKLQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQl1bnNpZ25l ZCBsb25nIHBmbiA9IF9fcGEoYWRkcikgPj4gUEFHRV9TSElGVDsKLQlwdGVfdCBwdGUgPSBwZm5f cHRlKHBmbiwgcHJvdCk7Ci0KLQlpZiAoSFlQRVJWSVNPUl91cGRhdGVfdmFfbWFwcGluZygodW5z aWduZWQgbG9uZylhZGRyLCBwdGUsIGZsYWdzKSkKLQkJQlVHKCk7Ci19Ci1zdGF0aWMgdm9pZCBf X2luaXQgc2V0X3BhZ2VfcHJvdCh2b2lkICphZGRyLCBwZ3Byb3RfdCBwcm90KQotewotCXJldHVy biBzZXRfcGFnZV9wcm90X2ZsYWdzKGFkZHIsIHByb3QsIFVWTUZfTk9ORSk7Ci19Ci0jaWZkZWYg Q09ORklHX1g4Nl8zMgotc3RhdGljIHZvaWQgX19pbml0IHhlbl9tYXBfaWRlbnRpdHlfZWFybHko cG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBtYXhfcGZuKQotewotCXVuc2lnbmVkIHBtZGlkeCwg cHRlaWR4OwotCXVuc2lnbmVkIGlkZW50X3B0ZTsKLQl1bnNpZ25lZCBsb25nIHBmbjsKLQotCWxl dmVsMV9pZGVudF9wZ3QgPSBleHRlbmRfYnJrKHNpemVvZihwdGVfdCkgKiBMRVZFTDFfSURFTlRf RU5UUklFUywKLQkJCQkgICAgICBQQUdFX1NJWkUpOwotCi0JaWRlbnRfcHRlID0gMDsKLQlwZm4g PSAwOwotCWZvciAocG1kaWR4ID0gMDsgcG1kaWR4IDwgUFRSU19QRVJfUE1EICYmIHBmbiA8IG1h eF9wZm47IHBtZGlkeCsrKSB7Ci0JCXB0ZV90ICpwdGVfcGFnZTsKLQotCQkvKiBSZXVzZSBvciBh bGxvY2F0ZSBhIHBhZ2Ugb2YgcHRlcyAqLwotCQlpZiAocG1kX3ByZXNlbnQocG1kW3BtZGlkeF0p KQotCQkJcHRlX3BhZ2UgPSBtMnYocG1kW3BtZGlkeF0ucG1kKTsKLQkJZWxzZSB7Ci0JCQkvKiBD aGVjayBmb3IgZnJlZSBwdGUgcGFnZXMgKi8KLQkJCWlmIChpZGVudF9wdGUgPT0gTEVWRUwxX0lE RU5UX0VOVFJJRVMpCi0JCQkJYnJlYWs7Ci0KLQkJCXB0ZV9wYWdlID0gJmxldmVsMV9pZGVudF9w Z3RbaWRlbnRfcHRlXTsKLQkJCWlkZW50X3B0ZSArPSBQVFJTX1BFUl9QVEU7Ci0KLQkJCXBtZFtw bWRpZHhdID0gX19wbWQoX19wYShwdGVfcGFnZSkgfCBfUEFHRV9UQUJMRSk7Ci0JCX0KLQotCQkv KiBJbnN0YWxsIG1hcHBpbmdzICovCi0JCWZvciAocHRlaWR4ID0gMDsgcHRlaWR4IDwgUFRSU19Q RVJfUFRFOyBwdGVpZHgrKywgcGZuKyspIHsKLQkJCXB0ZV90IHB0ZTsKLQotCQkJaWYgKHBmbiA+ IG1heF9wZm5fbWFwcGVkKQotCQkJCW1heF9wZm5fbWFwcGVkID0gcGZuOwotCi0JCQlpZiAoIXB0 ZV9ub25lKHB0ZV9wYWdlW3B0ZWlkeF0pKQotCQkJCWNvbnRpbnVlOwotCi0JCQlwdGUgPSBwZm5f cHRlKHBmbiwgUEFHRV9LRVJORUxfRVhFQyk7Ci0JCQlwdGVfcGFnZVtwdGVpZHhdID0gcHRlOwot CQl9Ci0JfQotCi0JZm9yIChwdGVpZHggPSAwOyBwdGVpZHggPCBpZGVudF9wdGU7IHB0ZWlkeCAr PSBQVFJTX1BFUl9QVEUpCi0JCXNldF9wYWdlX3Byb3QoJmxldmVsMV9pZGVudF9wZ3RbcHRlaWR4 XSwgUEFHRV9LRVJORUxfUk8pOwotCi0Jc2V0X3BhZ2VfcHJvdChwbWQsIFBBR0VfS0VSTkVMX1JP KTsKLX0KLSNlbmRpZgotdm9pZCBfX2luaXQgeGVuX3NldHVwX21hY2hwaHlzX21hcHBpbmcodm9p ZCkKLXsKLQlzdHJ1Y3QgeGVuX21hY2hwaHlzX21hcHBpbmcgbWFwcGluZzsKLQotCWlmIChIWVBF UlZJU09SX21lbW9yeV9vcChYRU5NRU1fbWFjaHBoeXNfbWFwcGluZywgJm1hcHBpbmcpID09IDAp IHsKLQkJbWFjaGluZV90b19waHlzX21hcHBpbmcgPSAodW5zaWduZWQgbG9uZyAqKW1hcHBpbmcu dl9zdGFydDsKLQkJbWFjaGluZV90b19waHlzX25yID0gbWFwcGluZy5tYXhfbWZuICsgMTsKLQl9 IGVsc2UgewotCQltYWNoaW5lX3RvX3BoeXNfbnIgPSBNQUNIMlBIWVNfTlJfRU5UUklFUzsKLQl9 Ci0jaWZkZWYgQ09ORklHX1g4Nl8zMgotCVdBUk5fT04oKG1hY2hpbmVfdG9fcGh5c19tYXBwaW5n ICsgKG1hY2hpbmVfdG9fcGh5c19uciAtIDEpKQotCQk8IG1hY2hpbmVfdG9fcGh5c19tYXBwaW5n KTsKLSNlbmRpZgotfQotCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotc3RhdGljIHZvaWQgX19pbml0 IGNvbnZlcnRfcGZuX21mbih2b2lkICp2KQotewotCXB0ZV90ICpwdGUgPSB2OwotCWludCBpOwot Ci0JLyogQWxsIGxldmVscyBhcmUgY29udmVydGVkIHRoZSBzYW1lIHdheSwgc28ganVzdCB0cmVh dCB0aGVtCi0JICAgYXMgcHRlcy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgUFRSU19QRVJfUFRFOyBp KyspCi0JCXB0ZVtpXSA9IHhlbl9tYWtlX3B0ZShwdGVbaV0ucHRlKTsKLX0KLXN0YXRpYyB2b2lk IF9faW5pdCBjaGVja19wdF9iYXNlKHVuc2lnbmVkIGxvbmcgKnB0X2Jhc2UsIHVuc2lnbmVkIGxv bmcgKnB0X2VuZCwKLQkJCQkgdW5zaWduZWQgbG9uZyBhZGRyKQotewotCWlmICgqcHRfYmFzZSA9 PSBQRk5fRE9XTihfX3BhKGFkZHIpKSkgewotCQlzZXRfcGFnZV9wcm90X2ZsYWdzKCh2b2lkICop YWRkciwgUEFHRV9LRVJORUwsIFVWTUZfSU5WTFBHKTsKLQkJY2xlYXJfcGFnZSgodm9pZCAqKWFk ZHIpOwotCQkoKnB0X2Jhc2UpKys7Ci0JfQotCWlmICgqcHRfZW5kID09IFBGTl9ET1dOKF9fcGEo YWRkcikpKSB7Ci0JCXNldF9wYWdlX3Byb3RfZmxhZ3MoKHZvaWQgKilhZGRyLCBQQUdFX0tFUk5F TCwgVVZNRl9JTlZMUEcpOwotCQljbGVhcl9wYWdlKCh2b2lkICopYWRkcik7Ci0JCSgqcHRfZW5k KS0tOwotCX0KLX0KLS8qCi0gKiBTZXQgdXAgdGhlIGluaXRpYWwga2VybmVsIHBhZ2V0YWJsZS4K LSAqCi0gKiBXZSBjYW4gY29uc3RydWN0IHRoaXMgYnkgZ3JhZnRpbmcgdGhlIFhlbiBwcm92aWRl ZCBwYWdldGFibGUgaW50bwotICogaGVhZF82NC5TJ3MgcHJlY29uc3RydWN0ZWQgcGFnZXRhYmxl cy4gIFdlIGNvcHkgdGhlIFhlbiBMMidzIGludG8KLSAqIGxldmVsMl9pZGVudF9wZ3QsIGFuZCBs ZXZlbDJfa2VybmVsX3BndC4gIFRoaXMgbWVhbnMgdGhhdCBvbmx5IHRoZQotICoga2VybmVsIGhh cyBhIHBoeXNpY2FsIG1hcHBpbmcgdG8gc3RhcnQgd2l0aCAtIGJ1dCB0aGF0J3MgZW5vdWdoIHRv Ci0gKiBnZXQgX192YSB3b3JraW5nLiAgV2UgbmVlZCB0byBmaWxsIGluIHRoZSByZXN0IG9mIHRo ZSBwaHlzaWNhbAotICogbWFwcGluZyBvbmNlIHNvbWUgc29ydCBvZiBhbGxvY2F0b3IgaGFzIGJl ZW4gc2V0IHVwLgotICovCi12b2lkIF9faW5pdCB4ZW5fc2V0dXBfa2VybmVsX3BhZ2V0YWJsZShw Z2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIG1heF9wZm4pCi17Ci0JcHVkX3QgKmwzOwotCXBtZF90 ICpsMjsKLQl1bnNpZ25lZCBsb25nIGFkZHJbM107Ci0JdW5zaWduZWQgbG9uZyBwdF9iYXNlLCBw dF9lbmQ7Ci0JdW5zaWduZWQgaTsKLQotCS8qIG1heF9wZm5fbWFwcGVkIGlzIHRoZSBsYXN0IHBm biBtYXBwZWQgaW4gdGhlIGluaXRpYWwgbWVtb3J5Ci0JICogbWFwcGluZ3MuIENvbnNpZGVyaW5n IHRoYXQgb24gWGVuIGFmdGVyIHRoZSBrZXJuZWwgbWFwcGluZ3Mgd2UKLQkgKiBoYXZlIHRoZSBt YXBwaW5ncyBvZiBzb21lIHBhZ2VzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gcGZuIHNwYWNlLCB3ZQot CSAqIHNldCBtYXhfcGZuX21hcHBlZCB0byB0aGUgbGFzdCByZWFsIHBmbiBtYXBwZWQuICovCi0J aWYgKHhlbl9zdGFydF9pbmZvLT5tZm5fbGlzdCA8IF9fU1RBUlRfS0VSTkVMX21hcCkKLQkJbWF4 X3Bmbl9tYXBwZWQgPSB4ZW5fc3RhcnRfaW5mby0+Zmlyc3RfcDJtX3BmbjsKLQllbHNlCi0JCW1h eF9wZm5fbWFwcGVkID0gUEZOX0RPV04oX19wYSh4ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3QpKTsK LQotCXB0X2Jhc2UgPSBQRk5fRE9XTihfX3BhKHhlbl9zdGFydF9pbmZvLT5wdF9iYXNlKSk7Ci0J cHRfZW5kID0gcHRfYmFzZSArIHhlbl9zdGFydF9pbmZvLT5ucl9wdF9mcmFtZXM7Ci0KLQkvKiBa YXAgaWRlbnRpdHkgbWFwcGluZyAqLwotCWluaXRfbGV2ZWw0X3BndFswXSA9IF9fcGdkKDApOwot Ci0JaWYgKCF4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSkgewot CQkvKiBQcmUtY29uc3RydWN0ZWQgZW50cmllcyBhcmUgaW4gcGZuLCBzbyBjb252ZXJ0IHRvIG1m biAqLwotCQkvKiBMNFsyNzJdIC0+IGxldmVsM19pZGVudF9wZ3QKLQkJICogTDRbNTExXSAtPiBs ZXZlbDNfa2VybmVsX3BndCAqLwotCQljb252ZXJ0X3Bmbl9tZm4oaW5pdF9sZXZlbDRfcGd0KTsK LQotCQkvKiBMM19pWzBdIC0+IGxldmVsMl9pZGVudF9wZ3QgKi8KLQkJY29udmVydF9wZm5fbWZu KGxldmVsM19pZGVudF9wZ3QpOwotCQkvKiBMM19rWzUxMF0gLT4gbGV2ZWwyX2tlcm5lbF9wZ3QK LQkJICogTDNfa1s1MTFdIC0+IGxldmVsMl9maXhtYXBfcGd0ICovCi0JCWNvbnZlcnRfcGZuX21m bihsZXZlbDNfa2VybmVsX3BndCk7Ci0KLQkJLyogTDNfa1s1MTFdWzUwNl0gLT4gbGV2ZWwxX2Zp eG1hcF9wZ3QgKi8KLQkJY29udmVydF9wZm5fbWZuKGxldmVsMl9maXhtYXBfcGd0KTsKLQl9Ci0J LyogV2UgZ2V0IFs1MTFdWzUxMV0gYW5kIGhhdmUgWGVuJ3MgdmVyc2lvbiBvZiBsZXZlbDJfa2Vy bmVsX3BndCAqLwotCWwzID0gbTJ2KHBnZFtwZ2RfaW5kZXgoX19TVEFSVF9LRVJORUxfbWFwKV0u cGdkKTsKLQlsMiA9IG0ydihsM1twdWRfaW5kZXgoX19TVEFSVF9LRVJORUxfbWFwKV0ucHVkKTsK LQotCWFkZHJbMF0gPSAodW5zaWduZWQgbG9uZylwZ2Q7Ci0JYWRkclsxXSA9ICh1bnNpZ25lZCBs b25nKWwzOwotCWFkZHJbMl0gPSAodW5zaWduZWQgbG9uZylsMjsKLQkvKiBHcmFmdCBpdCBvbnRv IEw0WzI3Ml1bMF0uIE5vdGUgdGhhdCB3ZSBjcmVhdGluZyBhbiBhbGlhc2luZyBwcm9ibGVtOgot CSAqIEJvdGggTDRbMjcyXVswXSBhbmQgTDRbNTExXVs1MTBdIGhhdmUgZW50cmllcyB0aGF0IHBv aW50IHRvIHRoZSBzYW1lCi0JICogTDIgKFBNRCkgdGFibGVzLiBNZWFuaW5nIHRoYXQgaWYgeW91 IG1vZGlmeSBpdCBpbiBfX3ZhIHNwYWNlCi0JICogaXQgd2lsbCBiZSBhbHNvIG1vZGlmaWVkIGlu IHRoZSBfX2thIHNwYWNlISAoQnV0IGlmIHlvdSBqdXN0Ci0JICogbW9kaWZ5IHRoZSBQTUQgdGFi bGUgdG8gcG9pbnQgdG8gb3RoZXIgUFRFJ3Mgb3Igbm9uZSwgdGhlbiB5b3UKLQkgKiBhcmUgT0sg LSB3aGljaCBpcyB3aGF0IGNsZWFudXBfaGlnaG1hcCBkb2VzKSAqLwotCWNvcHlfcGFnZShsZXZl bDJfaWRlbnRfcGd0LCBsMik7Ci0JLyogR3JhZnQgaXQgb250byBMNFs1MTFdWzUxMF0gKi8KLQlj b3B5X3BhZ2UobGV2ZWwyX2tlcm5lbF9wZ3QsIGwyKTsKLQotCS8qIENvcHkgdGhlIGluaXRpYWwg UC0+TSB0YWJsZSBtYXBwaW5ncyBpZiBuZWNlc3NhcnkuICovCi0JaSA9IHBnZF9pbmRleCh4ZW5f c3RhcnRfaW5mby0+bWZuX2xpc3QpOwotCWlmIChpICYmIGkgPCBwZ2RfaW5kZXgoX19TVEFSVF9L RVJORUxfbWFwKSkKLQkJaW5pdF9sZXZlbDRfcGd0W2ldID0gKChwZ2RfdCAqKXhlbl9zdGFydF9p bmZvLT5wdF9iYXNlKVtpXTsKLQotCWlmICgheGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3RyYW5z bGF0ZWRfcGh5c21hcCkpIHsKLQkJLyogTWFrZSBwYWdldGFibGUgcGllY2VzIFJPICovCi0JCXNl dF9wYWdlX3Byb3QoaW5pdF9sZXZlbDRfcGd0LCBQQUdFX0tFUk5FTF9STyk7Ci0JCXNldF9wYWdl X3Byb3QobGV2ZWwzX2lkZW50X3BndCwgUEFHRV9LRVJORUxfUk8pOwotCQlzZXRfcGFnZV9wcm90 KGxldmVsM19rZXJuZWxfcGd0LCBQQUdFX0tFUk5FTF9STyk7Ci0JCXNldF9wYWdlX3Byb3QobGV2 ZWwzX3VzZXJfdnN5c2NhbGwsIFBBR0VfS0VSTkVMX1JPKTsKLQkJc2V0X3BhZ2VfcHJvdChsZXZl bDJfaWRlbnRfcGd0LCBQQUdFX0tFUk5FTF9STyk7Ci0JCXNldF9wYWdlX3Byb3QobGV2ZWwyX2tl cm5lbF9wZ3QsIFBBR0VfS0VSTkVMX1JPKTsKLQkJc2V0X3BhZ2VfcHJvdChsZXZlbDJfZml4bWFw X3BndCwgUEFHRV9LRVJORUxfUk8pOwotCQlzZXRfcGFnZV9wcm90KGxldmVsMV9maXhtYXBfcGd0 LCBQQUdFX0tFUk5FTF9STyk7Ci0KLQkJLyogUGluIGRvd24gbmV3IEw0ICovCi0JCXBpbl9wYWdl dGFibGVfcGZuKE1NVUVYVF9QSU5fTDRfVEFCTEUsCi0JCQkJICBQRk5fRE9XTihfX3BhX3N5bWJv bChpbml0X2xldmVsNF9wZ3QpKSk7Ci0KLQkJLyogVW5waW4gWGVuLXByb3ZpZGVkIG9uZSAqLwot CQlwaW5fcGFnZXRhYmxlX3BmbihNTVVFWFRfVU5QSU5fVEFCTEUsIFBGTl9ET1dOKF9fcGEocGdk KSkpOwotCi0JCS8qCi0JCSAqIEF0IHRoaXMgc3RhZ2UgdGhlcmUgY2FuIGJlIG5vIHVzZXIgcGdk LCBhbmQgbm8gcGFnZQotCQkgKiBzdHJ1Y3R1cmUgdG8gYXR0YWNoIGl0IHRvLCBzbyBtYWtlIHN1 cmUgd2UganVzdCBzZXQga2VybmVsCi0JCSAqIHBnZC4KLQkJICovCi0JCXhlbl9tY19iYXRjaCgp OwotCQlfX3hlbl93cml0ZV9jcjModHJ1ZSwgX19wYShpbml0X2xldmVsNF9wZ3QpKTsKLQkJeGVu X21jX2lzc3VlKFBBUkFWSVJUX0xBWllfQ1BVKTsKLQl9IGVsc2UKLQkJbmF0aXZlX3dyaXRlX2Ny MyhfX3BhKGluaXRfbGV2ZWw0X3BndCkpOwotCi0JLyogV2UgY2FuJ3QgdGhhdCBlYXNpbHkgcmlw IG91dCBMMyBhbmQgTDIsIGFzIHRoZSBYZW4gcGFnZXRhYmxlcyBhcmUKLQkgKiBzZXQgb3V0IHRo aXMgd2F5OiBbTDRdLCBbTDFdLCBbTDJdLCBbTDNdLCBbTDFdLCBbTDFdIC4uLiAgZm9yCi0JICog dGhlIGluaXRpYWwgZG9tYWluLiBGb3IgZ3Vlc3RzIHVzaW5nIHRoZSB0b29sc3RhY2ssIHRoZXkg YXJlIGluOgotCSAqIFtMNF0sIFtMM10sIFtMMl0sIFtMMV0sIFtMMV0sIG9yZGVyIC4uIFNvIGZv ciBkb20wIHdlIGNhbiBvbmx5Ci0JICogcmlwIG91dCB0aGUgW0w0XSAocGdkKSwgYnV0IGZvciBn dWVzdHMgd2Ugc2hhdmUgb2ZmIHRocmVlIHBhZ2VzLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBB UlJBWV9TSVpFKGFkZHIpOyBpKyspCi0JCWNoZWNrX3B0X2Jhc2UoJnB0X2Jhc2UsICZwdF9lbmQs IGFkZHJbaV0pOwotCi0JLyogT3VyIChieSB0aHJlZSBwYWdlcykgc21hbGxlciBYZW4gcGFnZXRh YmxlIHRoYXQgd2UgYXJlIHVzaW5nICovCi0JeGVuX3B0X2Jhc2UgPSBQRk5fUEhZUyhwdF9iYXNl KTsKLQl4ZW5fcHRfc2l6ZSA9IChwdF9lbmQgLSBwdF9iYXNlKSAqIFBBR0VfU0laRTsKLQltZW1i bG9ja19yZXNlcnZlKHhlbl9wdF9iYXNlLCB4ZW5fcHRfc2l6ZSk7Ci0KLQkvKiBSZXZlY3RvciB0 aGUgeGVuX3N0YXJ0X2luZm8gKi8KLQl4ZW5fc3RhcnRfaW5mbyA9IChzdHJ1Y3Qgc3RhcnRfaW5m byAqKV9fdmEoX19wYSh4ZW5fc3RhcnRfaW5mbykpOwotfQotCi0vKgotICogUmVhZCBhIHZhbHVl IGZyb20gYSBwaHlzaWNhbCBhZGRyZXNzLgotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2lu aXQgeGVuX3JlYWRfcGh5c191bG9uZyhwaHlzX2FkZHJfdCBhZGRyKQotewotCXVuc2lnbmVkIGxv bmcgKnZhZGRyOwotCXVuc2lnbmVkIGxvbmcgdmFsOworI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgor I2luY2x1ZGUgPGFzbS94ZW4vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJjYWxsLmg+ CisjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9tZW1vcnkuaD4KIAotCXZhZGRyID0gZWFybHlfbWVt cmVtYXBfcm8oYWRkciwgc2l6ZW9mKHZhbCkpOwotCXZhbCA9ICp2YWRkcjsKLQllYXJseV9tZW11 bm1hcCh2YWRkciwgc2l6ZW9mKHZhbCkpOwotCXJldHVybiB2YWw7Ci19CisjaW5jbHVkZSAibXVs dGljYWxscy5oIgorI2luY2x1ZGUgIm1tdS5oIgogCiAvKgotICogVHJhbnNsYXRlIGEgdmlydHVh bCBhZGRyZXNzIHRvIGEgcGh5c2ljYWwgb25lIHdpdGhvdXQgcmVseWluZyBvbiBtYXBwZWQKLSAq IHBhZ2UgdGFibGVzLgorICogUHJvdGVjdHMgYXRvbWljIHJlc2VydmF0aW9uIGRlY3JlYXNlL2lu Y3JlYXNlIGFnYWluc3QgY29uY3VycmVudCBpbmNyZWFzZXMuCisgKiBBbHNvIHByb3RlY3RzIG5v bi1hdG9taWMgdXBkYXRlcyBvZiBjdXJyZW50X3BhZ2VzIGFuZCBiYWxsb29uIGxpc3RzLgogICov Ci1zdGF0aWMgcGh5c19hZGRyX3QgX19pbml0IHhlbl9lYXJseV92aXJ0X3RvX3BoeXModW5zaWdu ZWQgbG9uZyB2YWRkcikKLXsKLQlwaHlzX2FkZHJfdCBwYTsKLQlwZ2RfdCBwZ2Q7Ci0JcHVkX3Qg cHVkOwotCXBtZF90IHBtZDsKLQlwdGVfdCBwdGU7Ci0KLQlwYSA9IHJlYWRfY3IzKCk7Ci0JcGdk ID0gbmF0aXZlX21ha2VfcGdkKHhlbl9yZWFkX3BoeXNfdWxvbmcocGEgKyBwZ2RfaW5kZXgodmFk ZHIpICoKLQkJCQkJCSAgICAgICBzaXplb2YocGdkKSkpOwotCWlmICghcGdkX3ByZXNlbnQocGdk KSkKLQkJcmV0dXJuIDA7Ci0KLQlwYSA9IHBnZF92YWwocGdkKSAmIFBURV9QRk5fTUFTSzsKLQlw dWQgPSBuYXRpdmVfbWFrZV9wdWQoeGVuX3JlYWRfcGh5c191bG9uZyhwYSArIHB1ZF9pbmRleCh2 YWRkcikgKgotCQkJCQkJICAgICAgIHNpemVvZihwdWQpKSk7Ci0JaWYgKCFwdWRfcHJlc2VudChw dWQpKQotCQlyZXR1cm4gMDsKLQlwYSA9IHB1ZF9wZm4ocHVkKSA8PCBQQUdFX1NISUZUOwotCWlm IChwdWRfbGFyZ2UocHVkKSkKLQkJcmV0dXJuIHBhICsgKHZhZGRyICYgflBVRF9NQVNLKTsKLQot CXBtZCA9IG5hdGl2ZV9tYWtlX3BtZCh4ZW5fcmVhZF9waHlzX3Vsb25nKHBhICsgcG1kX2luZGV4 KHZhZGRyKSAqCi0JCQkJCQkgICAgICAgc2l6ZW9mKHBtZCkpKTsKLQlpZiAoIXBtZF9wcmVzZW50 KHBtZCkpCi0JCXJldHVybiAwOwotCXBhID0gcG1kX3BmbihwbWQpIDw8IFBBR0VfU0hJRlQ7Ci0J aWYgKHBtZF9sYXJnZShwbWQpKQotCQlyZXR1cm4gcGEgKyAodmFkZHIgJiB+UE1EX01BU0spOwot Ci0JcHRlID0gbmF0aXZlX21ha2VfcHRlKHhlbl9yZWFkX3BoeXNfdWxvbmcocGEgKyBwdGVfaW5k ZXgodmFkZHIpICoKLQkJCQkJCSAgICAgICBzaXplb2YocHRlKSkpOwotCWlmICghcHRlX3ByZXNl bnQocHRlKSkKLQkJcmV0dXJuIDA7Ci0JcGEgPSBwdGVfcGZuKHB0ZSkgPDwgUEFHRV9TSElGVDsK LQotCXJldHVybiBwYSB8ICh2YWRkciAmIH5QQUdFX01BU0spOwotfQorREVGSU5FX1NQSU5MT0NL KHhlbl9yZXNlcnZhdGlvbl9sb2NrKTsKIAotLyoKLSAqIEZpbmQgYSBuZXcgYXJlYSBmb3IgdGhl IGh5cGVydmlzb3Igc3VwcGxpZWQgcDJtIGxpc3QgYW5kIHJlbG9jYXRlIHRoZSBwMm0gdG8KLSAq IHRoaXMgYXJlYS4KLSAqLwotdm9pZCBfX2luaXQgeGVuX3JlbG9jYXRlX3AybSh2b2lkKQordW5z aWduZWQgbG9uZyBhcmJpdHJhcnlfdmlydF90b19tZm4odm9pZCAqdmFkZHIpCiB7Ci0JcGh5c19h ZGRyX3Qgc2l6ZSwgbmV3X2FyZWEsIHB0X3BoeXMsIHBtZF9waHlzLCBwdWRfcGh5czsKLQl1bnNp Z25lZCBsb25nIHAybV9wZm4sIHAybV9wZm5fZW5kLCBuX2ZyYW1lcywgcGZuLCBwZm5fZW5kOwot CWludCBuX3B0ZSwgbl9wdCwgbl9wbWQsIG5fcHVkLCBpZHhfcHRlLCBpZHhfcHQsIGlkeF9wbWQs IGlkeF9wdWQ7Ci0JcHRlX3QgKnB0OwotCXBtZF90ICpwbWQ7Ci0JcHVkX3QgKnB1ZDsKLQlwZ2Rf dCAqcGdkOwotCXVuc2lnbmVkIGxvbmcgKm5ld19wMm07Ci0KLQlzaXplID0gUEFHRV9BTElHTih4 ZW5fc3RhcnRfaW5mby0+bnJfcGFnZXMgKiBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCW5fcHRl ID0gcm91bmR1cChzaXplLCBQQUdFX1NJWkUpID4+IFBBR0VfU0hJRlQ7Ci0Jbl9wdCA9IHJvdW5k dXAoc2l6ZSwgUE1EX1NJWkUpID4+IFBNRF9TSElGVDsKLQluX3BtZCA9IHJvdW5kdXAoc2l6ZSwg UFVEX1NJWkUpID4+IFBVRF9TSElGVDsKLQluX3B1ZCA9IHJvdW5kdXAoc2l6ZSwgUEdESVJfU0la RSkgPj4gUEdESVJfU0hJRlQ7Ci0Jbl9mcmFtZXMgPSBuX3B0ZSArIG5fcHQgKyBuX3BtZCArIG5f cHVkOwotCi0JbmV3X2FyZWEgPSB4ZW5fZmluZF9mcmVlX2FyZWEoUEZOX1BIWVMobl9mcmFtZXMp KTsKLQlpZiAoIW5ld19hcmVhKSB7Ci0JCXhlbl9yYXdfY29uc29sZV93cml0ZSgiQ2FuJ3QgZmlu ZCBuZXcgbWVtb3J5IGFyZWEgZm9yIHAybSBuZWVkZWQgZHVlIHRvIEU4MjAgbWFwIGNvbmZsaWN0 XG4iKTsKLQkJQlVHKCk7Ci0JfQotCi0JLyoKLQkgKiBTZXR1cCB0aGUgcGFnZSB0YWJsZXMgZm9y IGFkZHJlc3NpbmcgdGhlIG5ldyBwMm0gbGlzdC4KLQkgKiBXZSBoYXZlIGFza2VkIHRoZSBoeXBl cnZpc29yIHRvIG1hcCB0aGUgcDJtIGxpc3QgYXQgdGhlIHVzZXIgYWRkcmVzcwotCSAqIFBVRF9T SVpFLiBJdCBtYXkgaGF2ZSBkb25lIHNvLCBvciBpdCBtYXkgaGF2ZSB1c2VkIGEga2VybmVsIHNw YWNlCi0JICogYWRkcmVzcyBkZXBlbmRpbmcgb24gdGhlIFhlbiB2ZXJzaW9uLgotCSAqIFRvIGF2 b2lkIGFueSBwb3NzaWJsZSB2aXJ0dWFsIGFkZHJlc3MgY29sbGlzaW9uLCBqdXN0IHVzZQotCSAq IDIgKiBQVURfU0laRSBmb3IgdGhlIG5ldyBhcmVhLgotCSAqLwotCXB1ZF9waHlzID0gbmV3X2Fy ZWE7Ci0JcG1kX3BoeXMgPSBwdWRfcGh5cyArIFBGTl9QSFlTKG5fcHVkKTsKLQlwdF9waHlzID0g cG1kX3BoeXMgKyBQRk5fUEhZUyhuX3BtZCk7Ci0JcDJtX3BmbiA9IFBGTl9ET1dOKHB0X3BoeXMp ICsgbl9wdDsKLQotCXBnZCA9IF9fdmEocmVhZF9jcjMoKSk7Ci0JbmV3X3AybSA9ICh1bnNpZ25l ZCBsb25nICopKDIgKiBQR0RJUl9TSVpFKTsKLQlmb3IgKGlkeF9wdWQgPSAwOyBpZHhfcHVkIDwg bl9wdWQ7IGlkeF9wdWQrKykgewotCQlwdWQgPSBlYXJseV9tZW1yZW1hcChwdWRfcGh5cywgUEFH RV9TSVpFKTsKLQkJY2xlYXJfcGFnZShwdWQpOwotCQlmb3IgKGlkeF9wbWQgPSAwOyBpZHhfcG1k IDwgbWluKG5fcG1kLCBQVFJTX1BFUl9QVUQpOwotCQkgICAgIGlkeF9wbWQrKykgewotCQkJcG1k ID0gZWFybHlfbWVtcmVtYXAocG1kX3BoeXMsIFBBR0VfU0laRSk7Ci0JCQljbGVhcl9wYWdlKHBt ZCk7Ci0JCQlmb3IgKGlkeF9wdCA9IDA7IGlkeF9wdCA8IG1pbihuX3B0LCBQVFJTX1BFUl9QTUQp OwotCQkJICAgICBpZHhfcHQrKykgewotCQkJCXB0ID0gZWFybHlfbWVtcmVtYXAocHRfcGh5cywg UEFHRV9TSVpFKTsKLQkJCQljbGVhcl9wYWdlKHB0KTsKLQkJCQlmb3IgKGlkeF9wdGUgPSAwOwot CQkJCSAgICAgaWR4X3B0ZSA8IG1pbihuX3B0ZSwgUFRSU19QRVJfUFRFKTsKLQkJCQkgICAgIGlk eF9wdGUrKykgewotCQkJCQlzZXRfcHRlKHB0ICsgaWR4X3B0ZSwKLQkJCQkJCXBmbl9wdGUocDJt X3BmbiwgUEFHRV9LRVJORUwpKTsKLQkJCQkJcDJtX3BmbisrOwotCQkJCX0KLQkJCQluX3B0ZSAt PSBQVFJTX1BFUl9QVEU7Ci0JCQkJZWFybHlfbWVtdW5tYXAocHQsIFBBR0VfU0laRSk7Ci0JCQkJ bWFrZV9sb3dtZW1fcGFnZV9yZWFkb25seShfX3ZhKHB0X3BoeXMpKTsKLQkJCQlwaW5fcGFnZXRh YmxlX3BmbihNTVVFWFRfUElOX0wxX1RBQkxFLAotCQkJCQkJICBQRk5fRE9XTihwdF9waHlzKSk7 Ci0JCQkJc2V0X3BtZChwbWQgKyBpZHhfcHQsCi0JCQkJCV9fcG1kKF9QQUdFX1RBQkxFIHwgcHRf cGh5cykpOwotCQkJCXB0X3BoeXMgKz0gUEFHRV9TSVpFOwotCQkJfQotCQkJbl9wdCAtPSBQVFJT X1BFUl9QTUQ7Ci0JCQllYXJseV9tZW11bm1hcChwbWQsIFBBR0VfU0laRSk7Ci0JCQltYWtlX2xv d21lbV9wYWdlX3JlYWRvbmx5KF9fdmEocG1kX3BoeXMpKTsKLQkJCXBpbl9wYWdldGFibGVfcGZu KE1NVUVYVF9QSU5fTDJfVEFCTEUsCi0JCQkJCSAgUEZOX0RPV04ocG1kX3BoeXMpKTsKLQkJCXNl dF9wdWQocHVkICsgaWR4X3BtZCwgX19wdWQoX1BBR0VfVEFCTEUgfCBwbWRfcGh5cykpOwotCQkJ cG1kX3BoeXMgKz0gUEFHRV9TSVpFOwotCQl9Ci0JCW5fcG1kIC09IFBUUlNfUEVSX1BVRDsKLQkJ ZWFybHlfbWVtdW5tYXAocHVkLCBQQUdFX1NJWkUpOwotCQltYWtlX2xvd21lbV9wYWdlX3JlYWRv bmx5KF9fdmEocHVkX3BoeXMpKTsKLQkJcGluX3BhZ2V0YWJsZV9wZm4oTU1VRVhUX1BJTl9MM19U QUJMRSwgUEZOX0RPV04ocHVkX3BoeXMpKTsKLQkJc2V0X3BnZChwZ2QgKyAyICsgaWR4X3B1ZCwg X19wZ2QoX1BBR0VfVEFCTEUgfCBwdWRfcGh5cykpOwotCQlwdWRfcGh5cyArPSBQQUdFX1NJWkU7 Ci0JfQotCi0JLyogTm93IGNvcHkgdGhlIG9sZCBwMm0gaW5mbyB0byB0aGUgbmV3IGFyZWEuICov Ci0JbWVtY3B5KG5ld19wMm0sIHhlbl9wMm1fYWRkciwgc2l6ZSk7Ci0JeGVuX3AybV9hZGRyID0g bmV3X3AybTsKLQotCS8qIFJlbGVhc2UgdGhlIG9sZCBwMm0gbGlzdCBhbmQgc2V0IG5ldyBsaXN0 IGluZm8uICovCi0JcDJtX3BmbiA9IFBGTl9ET1dOKHhlbl9lYXJseV92aXJ0X3RvX3BoeXMoeGVu X3N0YXJ0X2luZm8tPm1mbl9saXN0KSk7Ci0JQlVHX09OKCFwMm1fcGZuKTsKLQlwMm1fcGZuX2Vu ZCA9IHAybV9wZm4gKyBQRk5fRE9XTihzaXplKTsKLQotCWlmICh4ZW5fc3RhcnRfaW5mby0+bWZu X2xpc3QgPCBfX1NUQVJUX0tFUk5FTF9tYXApIHsKLQkJcGZuID0geGVuX3N0YXJ0X2luZm8tPmZp cnN0X3AybV9wZm47Ci0JCXBmbl9lbmQgPSB4ZW5fc3RhcnRfaW5mby0+Zmlyc3RfcDJtX3BmbiAr Ci0JCQkgIHhlbl9zdGFydF9pbmZvLT5ucl9wMm1fZnJhbWVzOwotCQlzZXRfcGdkKHBnZCArIDEs IF9fcGdkKDApKTsKLQl9IGVsc2UgewotCQlwZm4gPSBwMm1fcGZuOwotCQlwZm5fZW5kID0gcDJt X3Bmbl9lbmQ7Ci0JfQotCi0JbWVtYmxvY2tfZnJlZShQRk5fUEhZUyhwZm4pLCBQQUdFX1NJWkUg KiAocGZuX2VuZCAtIHBmbikpOwotCXdoaWxlIChwZm4gPCBwZm5fZW5kKSB7Ci0JCWlmIChwZm4g PT0gcDJtX3BmbikgewotCQkJcGZuID0gcDJtX3Bmbl9lbmQ7Ci0JCQljb250aW51ZTsKLQkJfQot CQltYWtlX2xvd21lbV9wYWdlX3JlYWR3cml0ZShfX3ZhKFBGTl9QSFlTKHBmbikpKTsKLQkJcGZu Kys7Ci0JfQorCXhtYWRkcl90IG1hZGRyID0gYXJiaXRyYXJ5X3ZpcnRfdG9fbWFjaGluZSh2YWRk cik7CiAKLQl4ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3QgPSAodW5zaWduZWQgbG9uZyl4ZW5fcDJt X2FkZHI7Ci0JeGVuX3N0YXJ0X2luZm8tPmZpcnN0X3AybV9wZm4gPSAgUEZOX0RPV04obmV3X2Fy ZWEpOwotCXhlbl9zdGFydF9pbmZvLT5ucl9wMm1fZnJhbWVzID0gbl9mcmFtZXM7CisJcmV0dXJu IFBGTl9ET1dOKG1hZGRyLm1hZGRyKTsKIH0KIAotI2Vsc2UJLyogIUNPTkZJR19YODZfNjQgKi8K LXN0YXRpYyBSRVNFUlZFX0JSS19BUlJBWShwbWRfdCwgaW5pdGlhbF9rZXJuZWxfcG1kLCBQVFJT X1BFUl9QTUQpOwotc3RhdGljIFJFU0VSVkVfQlJLX0FSUkFZKHBtZF90LCBzd2FwcGVyX2tlcm5l bF9wbWQsIFBUUlNfUEVSX1BNRCk7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB4ZW5fd3JpdGVfY3Iz X2luaXQodW5zaWduZWQgbG9uZyBjcjMpCit4bWFkZHJfdCBhcmJpdHJhcnlfdmlydF90b19tYWNo aW5lKHZvaWQgKnZhZGRyKQogewotCXVuc2lnbmVkIGxvbmcgcGZuID0gUEZOX0RPV04oX19wYShz d2FwcGVyX3BnX2RpcikpOwotCi0JQlVHX09OKHJlYWRfY3IzKCkgIT0gX19wYShpbml0aWFsX3Bh Z2VfdGFibGUpKTsKLQlCVUdfT04oY3IzICE9IF9fcGEoc3dhcHBlcl9wZ19kaXIpKTsKKwl1bnNp Z25lZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZyl2YWRkcjsKKwl1bnNpZ25lZCBpbnQg bGV2ZWw7CisJcHRlX3QgKnB0ZTsKKwl1bnNpZ25lZCBvZmZzZXQ7CiAKIAkvKgotCSAqIFdlIGFy ZSBzd2l0Y2hpbmcgdG8gc3dhcHBlcl9wZ19kaXIgZm9yIHRoZSBmaXJzdCB0aW1lIChmcm9tCi0J ICogaW5pdGlhbF9wYWdlX3RhYmxlKSBhbmQgdGhlcmVmb3JlIG5lZWQgdG8gbWFyayB0aGF0IHBh Z2UKLQkgKiByZWFkLW9ubHkgYW5kIHRoZW4gcGluIGl0LgotCSAqCi0JICogWGVuIGRpc2FsbG93 cyBzaGFyaW5nIG9mIGtlcm5lbCBQTURzIGZvciBQQUUKLQkgKiBndWVzdHMuIFRoZXJlZm9yZSB3 ZSBtdXN0IGNvcHkgdGhlIGtlcm5lbCBQTUQgZnJvbQotCSAqIGluaXRpYWxfcGFnZV90YWJsZSBp bnRvIGEgbmV3IGtlcm5lbCBQTUQgdG8gYmUgdXNlZCBpbgotCSAqIHN3YXBwZXJfcGdfZGlyLgor CSAqIGlmIHRoZSBQRk4gaXMgaW4gdGhlIGxpbmVhciBtYXBwZWQgdmFkZHIgcmFuZ2UsIHdlIGNh biBqdXN0IHVzZQorCSAqIHRoZSAocXVpY2spIHZpcnRfdG9fbWFjaGluZSgpIHAybSBsb29rdXAK IAkgKi8KLQlzd2FwcGVyX2tlcm5lbF9wbWQgPQotCQlleHRlbmRfYnJrKHNpemVvZihwbWRfdCkg KiBQVFJTX1BFUl9QTUQsIFBBR0VfU0laRSk7Ci0JY29weV9wYWdlKHN3YXBwZXJfa2VybmVsX3Bt ZCwgaW5pdGlhbF9rZXJuZWxfcG1kKTsKLQlzd2FwcGVyX3BnX2RpcltLRVJORUxfUEdEX0JPVU5E QVJZXSA9Ci0JCV9fcGdkKF9fcGEoc3dhcHBlcl9rZXJuZWxfcG1kKSB8IF9QQUdFX1BSRVNFTlQp OwotCXNldF9wYWdlX3Byb3Qoc3dhcHBlcl9rZXJuZWxfcG1kLCBQQUdFX0tFUk5FTF9STyk7Ci0K LQlzZXRfcGFnZV9wcm90KHN3YXBwZXJfcGdfZGlyLCBQQUdFX0tFUk5FTF9STyk7Ci0JeGVuX3dy aXRlX2NyMyhjcjMpOwotCXBpbl9wYWdldGFibGVfcGZuKE1NVUVYVF9QSU5fTDNfVEFCTEUsIHBm bik7Ci0KLQlwaW5fcGFnZXRhYmxlX3BmbihNTVVFWFRfVU5QSU5fVEFCTEUsCi0JCQkgIFBGTl9E T1dOKF9fcGEoaW5pdGlhbF9wYWdlX3RhYmxlKSkpOwotCXNldF9wYWdlX3Byb3QoaW5pdGlhbF9w YWdlX3RhYmxlLCBQQUdFX0tFUk5FTCk7Ci0Jc2V0X3BhZ2VfcHJvdChpbml0aWFsX2tlcm5lbF9w bWQsIFBBR0VfS0VSTkVMKTsKLQotCXB2X21tdV9vcHMud3JpdGVfY3IzID0gJnhlbl93cml0ZV9j cjM7Ci19Ci0KLS8qCi0gKiBGb3IgMzIgYml0IGRvbWFpbnMgeGVuX3N0YXJ0X2luZm8tPnB0X2Jh c2UgaXMgdGhlIHBnZCBhZGRyZXNzIHdoaWNoIG1pZ2h0IGJlCi0gKiBub3QgdGhlIGZpcnN0IHBh Z2UgdGFibGUgaW4gdGhlIHBhZ2UgdGFibGUgcG9vbC4KLSAqIEl0ZXJhdGUgdGhyb3VnaCB0aGUg aW5pdGlhbCBwYWdlIHRhYmxlcyB0byBmaW5kIHRoZSByZWFsIHBhZ2UgdGFibGUgYmFzZS4KLSAq Lwotc3RhdGljIHBoeXNfYWRkcl90IHhlbl9maW5kX3B0X2Jhc2UocG1kX3QgKnBtZCkKLXsKLQlw aHlzX2FkZHJfdCBwdF9iYXNlLCBwYWRkcjsKLQl1bnNpZ25lZCBwbWRpZHg7Ci0KLQlwdF9iYXNl ID0gbWluKF9fcGEoeGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2UpLCBfX3BhKHBtZCkpOwotCi0JZm9y IChwbWRpZHggPSAwOyBwbWRpZHggPCBQVFJTX1BFUl9QTUQ7IHBtZGlkeCsrKQotCQlpZiAocG1k X3ByZXNlbnQocG1kW3BtZGlkeF0pICYmICFwbWRfbGFyZ2UocG1kW3BtZGlkeF0pKSB7Ci0JCQlw YWRkciA9IG0ycChwbWRbcG1kaWR4XS5wbWQpOwotCQkJcHRfYmFzZSA9IG1pbihwdF9iYXNlLCBw YWRkcik7Ci0JCX0KLQotCXJldHVybiBwdF9iYXNlOwotfQotCi12b2lkIF9faW5pdCB4ZW5fc2V0 dXBfa2VybmVsX3BhZ2V0YWJsZShwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIG1heF9wZm4pCi17 Ci0JcG1kX3QgKmtlcm5lbF9wbWQ7Ci0KLQlrZXJuZWxfcG1kID0gbTJ2KHBnZFtLRVJORUxfUEdE X0JPVU5EQVJZXS5wZ2QpOwotCi0JeGVuX3B0X2Jhc2UgPSB4ZW5fZmluZF9wdF9iYXNlKGtlcm5l bF9wbWQpOwotCXhlbl9wdF9zaXplID0geGVuX3N0YXJ0X2luZm8tPm5yX3B0X2ZyYW1lcyAqIFBB R0VfU0laRTsKLQotCWluaXRpYWxfa2VybmVsX3BtZCA9Ci0JCWV4dGVuZF9icmsoc2l6ZW9mKHBt ZF90KSAqIFBUUlNfUEVSX1BNRCwgUEFHRV9TSVpFKTsKLQotCW1heF9wZm5fbWFwcGVkID0gUEZO X0RPV04oeGVuX3B0X2Jhc2UgKyB4ZW5fcHRfc2l6ZSArIDUxMiAqIDEwMjQpOwotCi0JY29weV9w YWdlKGluaXRpYWxfa2VybmVsX3BtZCwga2VybmVsX3BtZCk7Ci0KLQl4ZW5fbWFwX2lkZW50aXR5 X2Vhcmx5KGluaXRpYWxfa2VybmVsX3BtZCwgbWF4X3Bmbik7Ci0KLQljb3B5X3BhZ2UoaW5pdGlh bF9wYWdlX3RhYmxlLCBwZ2QpOwotCWluaXRpYWxfcGFnZV90YWJsZVtLRVJORUxfUEdEX0JPVU5E QVJZXSA9Ci0JCV9fcGdkKF9fcGEoaW5pdGlhbF9rZXJuZWxfcG1kKSB8IF9QQUdFX1BSRVNFTlQp OwotCi0Jc2V0X3BhZ2VfcHJvdChpbml0aWFsX2tlcm5lbF9wbWQsIFBBR0VfS0VSTkVMX1JPKTsK LQlzZXRfcGFnZV9wcm90KGluaXRpYWxfcGFnZV90YWJsZSwgUEFHRV9LRVJORUxfUk8pOwotCXNl dF9wYWdlX3Byb3QoZW1wdHlfemVyb19wYWdlLCBQQUdFX0tFUk5FTF9STyk7Ci0KLQlwaW5fcGFn ZXRhYmxlX3BmbihNTVVFWFRfVU5QSU5fVEFCTEUsIFBGTl9ET1dOKF9fcGEocGdkKSkpOwotCi0J cGluX3BhZ2V0YWJsZV9wZm4oTU1VRVhUX1BJTl9MM19UQUJMRSwKLQkJCSAgUEZOX0RPV04oX19w YShpbml0aWFsX3BhZ2VfdGFibGUpKSk7Ci0JeGVuX3dyaXRlX2NyMyhfX3BhKGluaXRpYWxfcGFn ZV90YWJsZSkpOwotCi0JbWVtYmxvY2tfcmVzZXJ2ZSh4ZW5fcHRfYmFzZSwgeGVuX3B0X3NpemUp OwotfQotI2VuZGlmCS8qIENPTkZJR19YODZfNjQgKi8KLQotdm9pZCBfX2luaXQgeGVuX3Jlc2Vy dmVfc3BlY2lhbF9wYWdlcyh2b2lkKQotewotCXBoeXNfYWRkcl90IHBhZGRyOwotCi0JbWVtYmxv Y2tfcmVzZXJ2ZShfX3BhKHhlbl9zdGFydF9pbmZvKSwgUEFHRV9TSVpFKTsKLQlpZiAoeGVuX3N0 YXJ0X2luZm8tPnN0b3JlX21mbikgewotCQlwYWRkciA9IFBGTl9QSFlTKG1mbl90b19wZm4oeGVu X3N0YXJ0X2luZm8tPnN0b3JlX21mbikpOwotCQltZW1ibG9ja19yZXNlcnZlKHBhZGRyLCBQQUdF X1NJWkUpOwotCX0KLQlpZiAoIXhlbl9pbml0aWFsX2RvbWFpbigpKSB7Ci0JCXBhZGRyID0gUEZO X1BIWVMobWZuX3RvX3Bmbih4ZW5fc3RhcnRfaW5mby0+Y29uc29sZS5kb21VLm1mbikpOwotCQlt ZW1ibG9ja19yZXNlcnZlKHBhZGRyLCBQQUdFX1NJWkUpOwotCX0KLX0KLQotdm9pZCBfX2luaXQg eGVuX3B0X2NoZWNrX2U4MjAodm9pZCkKLXsKLQlpZiAoeGVuX2lzX2U4MjBfcmVzZXJ2ZWQoeGVu X3B0X2Jhc2UsIHhlbl9wdF9zaXplKSkgewotCQl4ZW5fcmF3X2NvbnNvbGVfd3JpdGUoIlhlbiBo eXBlcnZpc29yIGFsbG9jYXRlZCBwYWdlIHRhYmxlIG1lbW9yeSBjb25mbGljdHMgd2l0aCBFODIw IG1hcFxuIik7Ci0JCUJVRygpOwotCX0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgZHVtbXlf bWFwcGluZ1tQQUdFX1NJWkVdIF9fcGFnZV9hbGlnbmVkX2JzczsKLQotc3RhdGljIHZvaWQgeGVu X3NldF9maXhtYXAodW5zaWduZWQgaWR4LCBwaHlzX2FkZHJfdCBwaHlzLCBwZ3Byb3RfdCBwcm90 KQotewotCXB0ZV90IHB0ZTsKLQotCXBoeXMgPj49IFBBR0VfU0hJRlQ7Ci0KLQlzd2l0Y2ggKGlk eCkgewotCWNhc2UgRklYX0JUTUFQX0VORCAuLi4gRklYX0JUTUFQX0JFR0lOOgotCWNhc2UgRklY X1JPX0lEVDoKLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0JY2FzZSBGSVhfV1BfVEVTVDoKLSMgaWZk ZWYgQ09ORklHX0hJR0hNRU0KLQljYXNlIEZJWF9LTUFQX0JFR0lOIC4uLiBGSVhfS01BUF9FTkQ6 Ci0jIGVuZGlmCi0jZWxpZiBkZWZpbmVkKENPTkZJR19YODZfVlNZU0NBTExfRU1VTEFUSU9OKQot CWNhc2UgVlNZU0NBTExfUEFHRToKLSNlbmRpZgotCWNhc2UgRklYX1RFWFRfUE9LRTA6Ci0JY2Fz ZSBGSVhfVEVYVF9QT0tFMToKLQkJLyogQWxsIGxvY2FsIHBhZ2UgbWFwcGluZ3MgKi8KLQkJcHRl ID0gcGZuX3B0ZShwaHlzLCBwcm90KTsKLQkJYnJlYWs7Ci0KLSNpZmRlZiBDT05GSUdfWDg2X0xP Q0FMX0FQSUMKLQljYXNlIEZJWF9BUElDX0JBU0U6CS8qIG1hcHMgZHVtbXkgbG9jYWwgQVBJQyAq LwotCQlwdGUgPSBwZm5fcHRlKFBGTl9ET1dOKF9fcGEoZHVtbXlfbWFwcGluZykpLCBQQUdFX0tF Uk5FTCk7Ci0JCWJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKLQlj YXNlIEZJWF9JT19BUElDX0JBU0VfMCAuLi4gRklYX0lPX0FQSUNfQkFTRV9FTkQ6Ci0JCS8qCi0J CSAqIFdlIGp1c3QgZG9uJ3QgbWFwIHRoZSBJTyBBUElDIC0gYWxsIGFjY2VzcyBpcyB2aWEKLQkJ ICogaHlwZXJjYWxscy4gIEtlZXAgdGhlIGFkZHJlc3MgaW4gdGhlIHB0ZSBmb3IgcmVmZXJlbmNl LgotCQkgKi8KLQkJcHRlID0gcGZuX3B0ZShQRk5fRE9XTihfX3BhKGR1bW15X21hcHBpbmcpKSwg UEFHRV9LRVJORUwpOwotCQlicmVhazsKLSNlbmRpZgotCi0JY2FzZSBGSVhfUEFSQVZJUlRfQk9P VE1BUDoKLQkJLyogVGhpcyBpcyBhbiBNRk4sIGJ1dCBpdCBpc24ndCBhbiBJTyBtYXBwaW5nIGZy b20gdGhlCi0JCSAgIElPIGRvbWFpbiAqLwotCQlwdGUgPSBtZm5fcHRlKHBoeXMsIHByb3QpOwot CQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCS8qIEJ5IGRlZmF1bHQsIHNldF9maXhtYXAgaXMgdXNl ZCBmb3IgaGFyZHdhcmUgbWFwcGluZ3MgKi8KLQkJcHRlID0gbWZuX3B0ZShwaHlzLCBwcm90KTsK LQkJYnJlYWs7Ci0JfQotCi0JX19uYXRpdmVfc2V0X2ZpeG1hcChpZHgsIHB0ZSk7Ci0KLSNpZmRl ZiBDT05GSUdfWDg2X1ZTWVNDQUxMX0VNVUxBVElPTgotCS8qIFJlcGxpY2F0ZSBjaGFuZ2VzIHRv IG1hcCB0aGUgdnN5c2NhbGwgcGFnZSBpbnRvIHRoZSB1c2VyCi0JICAgcGFnZXRhYmxlIHZzeXNj YWxsIG1hcHBpbmcuICovCi0JaWYgKGlkeCA9PSBWU1lTQ0FMTF9QQUdFKSB7Ci0JCXVuc2lnbmVk IGxvbmcgdmFkZHIgPSBfX2ZpeF90b192aXJ0KGlkeCk7Ci0JCXNldF9wdGVfdmFkZHJfcHVkKGxl dmVsM191c2VyX3ZzeXNjYWxsLCB2YWRkciwgcHRlKTsKLQl9Ci0jZW5kaWYKLX0KLQotc3RhdGlj IHZvaWQgX19pbml0IHhlbl9wb3N0X2FsbG9jYXRvcl9pbml0KHZvaWQpCi17Ci0JaWYgKHhlbl9m ZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVkX3BoeXNtYXApKQotCQlyZXR1cm47Ci0KLQlw dl9tbXVfb3BzLnNldF9wdGUgPSB4ZW5fc2V0X3B0ZTsKLQlwdl9tbXVfb3BzLnNldF9wbWQgPSB4 ZW5fc2V0X3BtZDsKLQlwdl9tbXVfb3BzLnNldF9wdWQgPSB4ZW5fc2V0X3B1ZDsKLSNpZiBDT05G SUdfUEdUQUJMRV9MRVZFTFMgPT0gNAotCXB2X21tdV9vcHMuc2V0X3BnZCA9IHhlbl9zZXRfcGdk OwotI2VuZGlmCi0KLQkvKiBUaGlzIHdpbGwgd29yayBhcyBsb25nIGFzIHBhdGNoaW5nIGhhc24n dCBoYXBwZW5lZCB5ZXQKLQkgICAod2hpY2ggaXQgaGFzbid0KSAqLwotCXB2X21tdV9vcHMuYWxs b2NfcHRlID0geGVuX2FsbG9jX3B0ZTsKLQlwdl9tbXVfb3BzLmFsbG9jX3BtZCA9IHhlbl9hbGxv Y19wbWQ7Ci0JcHZfbW11X29wcy5yZWxlYXNlX3B0ZSA9IHhlbl9yZWxlYXNlX3B0ZTsKLQlwdl9t bXVfb3BzLnJlbGVhc2VfcG1kID0geGVuX3JlbGVhc2VfcG1kOwotI2lmIENPTkZJR19QR1RBQkxF X0xFVkVMUyA9PSA0Ci0JcHZfbW11X29wcy5hbGxvY19wdWQgPSB4ZW5fYWxsb2NfcHVkOwotCXB2 X21tdV9vcHMucmVsZWFzZV9wdWQgPSB4ZW5fcmVsZWFzZV9wdWQ7Ci0jZW5kaWYKLQlwdl9tbXVf b3BzLm1ha2VfcHRlID0gUFZfQ0FMTEVFX1NBVkUoeGVuX21ha2VfcHRlKTsKLQotI2lmZGVmIENP TkZJR19YODZfNjQKLQlwdl9tbXVfb3BzLndyaXRlX2NyMyA9ICZ4ZW5fd3JpdGVfY3IzOwotCVNl dFBhZ2VQaW5uZWQodmlydF90b19wYWdlKGxldmVsM191c2VyX3ZzeXNjYWxsKSk7Ci0jZW5kaWYK LQl4ZW5fbWFya19pbml0X21tX3Bpbm5lZCgpOwotfQotCi1zdGF0aWMgdm9pZCB4ZW5fbGVhdmVf bGF6eV9tbXUodm9pZCkKLXsKLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQl4ZW5fbWNfZmx1c2goKTsK LQlwYXJhdmlydF9sZWF2ZV9sYXp5X21tdSgpOwotCXByZWVtcHRfZW5hYmxlKCk7Ci19Ci0KLXN0 YXRpYyBjb25zdCBzdHJ1Y3QgcHZfbW11X29wcyB4ZW5fbW11X29wcyBfX2luaXRjb25zdCA9IHsK LQkucmVhZF9jcjIgPSB4ZW5fcmVhZF9jcjIsCi0JLndyaXRlX2NyMiA9IHhlbl93cml0ZV9jcjIs Ci0KLQkucmVhZF9jcjMgPSB4ZW5fcmVhZF9jcjMsCi0JLndyaXRlX2NyMyA9IHhlbl93cml0ZV9j cjNfaW5pdCwKLQotCS5mbHVzaF90bGJfdXNlciA9IHhlbl9mbHVzaF90bGIsCi0JLmZsdXNoX3Rs Yl9rZXJuZWwgPSB4ZW5fZmx1c2hfdGxiLAotCS5mbHVzaF90bGJfc2luZ2xlID0geGVuX2ZsdXNo X3RsYl9zaW5nbGUsCi0JLmZsdXNoX3RsYl9vdGhlcnMgPSB4ZW5fZmx1c2hfdGxiX290aGVycywK LQotCS5wdGVfdXBkYXRlID0gcGFyYXZpcnRfbm9wLAotCi0JLnBnZF9hbGxvYyA9IHhlbl9wZ2Rf YWxsb2MsCi0JLnBnZF9mcmVlID0geGVuX3BnZF9mcmVlLAotCi0JLmFsbG9jX3B0ZSA9IHhlbl9h bGxvY19wdGVfaW5pdCwKLQkucmVsZWFzZV9wdGUgPSB4ZW5fcmVsZWFzZV9wdGVfaW5pdCwKLQku YWxsb2NfcG1kID0geGVuX2FsbG9jX3BtZF9pbml0LAotCS5yZWxlYXNlX3BtZCA9IHhlbl9yZWxl YXNlX3BtZF9pbml0LAotCi0JLnNldF9wdGUgPSB4ZW5fc2V0X3B0ZV9pbml0LAotCS5zZXRfcHRl X2F0ID0geGVuX3NldF9wdGVfYXQsCi0JLnNldF9wbWQgPSB4ZW5fc2V0X3BtZF9oeXBlciwKLQot CS5wdGVwX21vZGlmeV9wcm90X3N0YXJ0ID0gX19wdGVwX21vZGlmeV9wcm90X3N0YXJ0LAotCS5w dGVwX21vZGlmeV9wcm90X2NvbW1pdCA9IF9fcHRlcF9tb2RpZnlfcHJvdF9jb21taXQsCi0KLQku cHRlX3ZhbCA9IFBWX0NBTExFRV9TQVZFKHhlbl9wdGVfdmFsKSwKLQkucGdkX3ZhbCA9IFBWX0NB TExFRV9TQVZFKHhlbl9wZ2RfdmFsKSwKLQotCS5tYWtlX3B0ZSA9IFBWX0NBTExFRV9TQVZFKHhl bl9tYWtlX3B0ZV9pbml0KSwKLQkubWFrZV9wZ2QgPSBQVl9DQUxMRUVfU0FWRSh4ZW5fbWFrZV9w Z2QpLAotCi0jaWZkZWYgQ09ORklHX1g4Nl9QQUUKLQkuc2V0X3B0ZV9hdG9taWMgPSB4ZW5fc2V0 X3B0ZV9hdG9taWMsCi0JLnB0ZV9jbGVhciA9IHhlbl9wdGVfY2xlYXIsCi0JLnBtZF9jbGVhciA9 IHhlbl9wbWRfY2xlYXIsCi0jZW5kaWYJLyogQ09ORklHX1g4Nl9QQUUgKi8KLQkuc2V0X3B1ZCA9 IHhlbl9zZXRfcHVkX2h5cGVyLAotCi0JLm1ha2VfcG1kID0gUFZfQ0FMTEVFX1NBVkUoeGVuX21h a2VfcG1kKSwKLQkucG1kX3ZhbCA9IFBWX0NBTExFRV9TQVZFKHhlbl9wbWRfdmFsKSwKLQotI2lm IENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSA0Ci0JLnB1ZF92YWwgPSBQVl9DQUxMRUVfU0FWRSh4 ZW5fcHVkX3ZhbCksCi0JLm1ha2VfcHVkID0gUFZfQ0FMTEVFX1NBVkUoeGVuX21ha2VfcHVkKSwK LQkuc2V0X3BnZCA9IHhlbl9zZXRfcGdkX2h5cGVyLAotCi0JLmFsbG9jX3B1ZCA9IHhlbl9hbGxv Y19wbWRfaW5pdCwKLQkucmVsZWFzZV9wdWQgPSB4ZW5fcmVsZWFzZV9wbWRfaW5pdCwKLSNlbmRp ZgkvKiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPT0gNCAqLwotCi0JLmFjdGl2YXRlX21tID0geGVu X2FjdGl2YXRlX21tLAotCS5kdXBfbW1hcCA9IHhlbl9kdXBfbW1hcCwKLQkuZXhpdF9tbWFwID0g eGVuX2V4aXRfbW1hcCwKLQotCS5sYXp5X21vZGUgPSB7Ci0JCS5lbnRlciA9IHBhcmF2aXJ0X2Vu dGVyX2xhenlfbW11LAotCQkubGVhdmUgPSB4ZW5fbGVhdmVfbGF6eV9tbXUsCi0JCS5mbHVzaCA9 IHBhcmF2aXJ0X2ZsdXNoX2xhenlfbW11LAotCX0sCi0KLQkuc2V0X2ZpeG1hcCA9IHhlbl9zZXRf Zml4bWFwLAotfTsKLQotdm9pZCBfX2luaXQgeGVuX2luaXRfbW11X29wcyh2b2lkKQotewotCXg4 Nl9pbml0LnBhZ2luZy5wYWdldGFibGVfaW5pdCA9IHhlbl9wYWdldGFibGVfaW5pdDsKLQotCWlm ICh4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSkKLQkJcmV0dXJu OworCWlmICh2aXJ0X2FkZHJfdmFsaWQodmFkZHIpKQorCQlyZXR1cm4gdmlydF90b19tYWNoaW5l KHZhZGRyKTsKIAotCXB2X21tdV9vcHMgPSB4ZW5fbW11X29wczsKKwkvKiBvdGhlcndpc2Ugd2Ug aGF2ZSB0byBkbyBhIChzbG93ZXIpIGZ1bGwgcGFnZS10YWJsZSB3YWxrICovCiAKLQltZW1zZXQo ZHVtbXlfbWFwcGluZywgMHhmZiwgUEFHRV9TSVpFKTsKKwlwdGUgPSBsb29rdXBfYWRkcmVzcyhh ZGRyZXNzLCAmbGV2ZWwpOworCUJVR19PTihwdGUgPT0gTlVMTCk7CisJb2Zmc2V0ID0gYWRkcmVz cyAmIH5QQUdFX01BU0s7CisJcmV0dXJuIFhNQUREUigoKHBoeXNfYWRkcl90KXB0ZV9tZm4oKnB0 ZSkgPDwgUEFHRV9TSElGVCkgKyBvZmZzZXQpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXJiaXRy YXJ5X3ZpcnRfdG9fbWFjaGluZSk7CiAKLS8qIFByb3RlY3RlZCBieSB4ZW5fcmVzZXJ2YXRpb25f bG9jay4gKi8KLSNkZWZpbmUgTUFYX0NPTlRJR19PUkRFUiA5IC8qIDJNQiAqLwotc3RhdGljIHVu c2lnbmVkIGxvbmcgZGlzY29udGlnX2ZyYW1lc1sxPDxNQVhfQ09OVElHX09SREVSXTsKLQotI2Rl ZmluZSBWT0lEX1BURSAobWZuX3B0ZSgwLCBfX3BncHJvdCgwKSkpCi1zdGF0aWMgdm9pZCB4ZW5f emFwX3Bmbl9yYW5nZSh1bnNpZ25lZCBsb25nIHZhZGRyLCB1bnNpZ25lZCBpbnQgb3JkZXIsCi0J CQkJdW5zaWduZWQgbG9uZyAqaW5fZnJhbWVzLAotCQkJCXVuc2lnbmVkIGxvbmcgKm91dF9mcmFt ZXMpCit2b2lkIHhlbl9mbHVzaF90bGJfYWxsKHZvaWQpCiB7Ci0JaW50IGk7CisJc3RydWN0IG1t dWV4dF9vcCAqb3A7CiAJc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7CiAKLQl4ZW5fbWNfYmF0 Y2goKTsKLQlmb3IgKGkgPSAwOyBpIDwgKDFVTDw8b3JkZXIpOyBpKyssIHZhZGRyICs9IFBBR0Vf U0laRSkgewotCQltY3MgPSBfX3hlbl9tY19lbnRyeSgwKTsKLQotCQlpZiAoaW5fZnJhbWVzKQot CQkJaW5fZnJhbWVzW2ldID0gdmlydF90b19tZm4odmFkZHIpOwotCi0JCU1VTFRJX3VwZGF0ZV92 YV9tYXBwaW5nKG1jcy5tYywgdmFkZHIsIFZPSURfUFRFLCAwKTsKLQkJX19zZXRfcGh5c190b19t YWNoaW5lKHZpcnRfdG9fcGZuKHZhZGRyKSwgSU5WQUxJRF9QMk1fRU5UUlkpOwotCi0JCWlmIChv dXRfZnJhbWVzKQotCQkJb3V0X2ZyYW1lc1tpXSA9IHZpcnRfdG9fcGZuKHZhZGRyKTsKLQl9Ci0J eGVuX21jX2lzc3VlKDApOwotfQotCi0vKgotICogVXBkYXRlIHRoZSBwZm4tdG8tbWZuIG1hcHBp bmdzIGZvciBhIHZpcnR1YWwgYWRkcmVzcyByYW5nZSwgZWl0aGVyIHRvCi0gKiBwb2ludCB0byBh biBhcnJheSBvZiBtZm5zLCBvciBjb250aWd1b3VzbHkgZnJvbSBhIHNpbmdsZSBzdGFydGluZwot ICogbWZuLgotICovCi1zdGF0aWMgdm9pZCB4ZW5fcmVtYXBfZXhjaGFuZ2VkX3B0ZXModW5zaWdu ZWQgbG9uZyB2YWRkciwgaW50IG9yZGVyLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqbWZucywK LQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZmlyc3RfbWZuKQotewotCXVuc2lnbmVkIGksIGxpbWl0 OwotCXVuc2lnbmVkIGxvbmcgbWZuOwotCi0JeGVuX21jX2JhdGNoKCk7Ci0KLQlsaW1pdCA9IDF1 IDw8IG9yZGVyOwotCWZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSsrLCB2YWRkciArPSBQQUdFX1NJ WkUpIHsKLQkJc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7Ci0JCXVuc2lnbmVkIGZsYWdzOwot Ci0JCW1jcyA9IF9feGVuX21jX2VudHJ5KDApOwotCQlpZiAobWZucykKLQkJCW1mbiA9IG1mbnNb aV07Ci0JCWVsc2UKLQkJCW1mbiA9IGZpcnN0X21mbiArIGk7Ci0KLQkJaWYgKGkgPCAobGltaXQg LSAxKSkKLQkJCWZsYWdzID0gMDsKLQkJZWxzZSB7Ci0JCQlpZiAob3JkZXIgPT0gMCkKLQkJCQlm bGFncyA9IFVWTUZfSU5WTFBHIHwgVVZNRl9BTEw7Ci0JCQllbHNlCi0JCQkJZmxhZ3MgPSBVVk1G X1RMQl9GTFVTSCB8IFVWTUZfQUxMOwotCQl9Ci0KLQkJTVVMVElfdXBkYXRlX3ZhX21hcHBpbmco bWNzLm1jLCB2YWRkciwKLQkJCQltZm5fcHRlKG1mbiwgUEFHRV9LRVJORUwpLCBmbGFncyk7Ci0K LQkJc2V0X3BoeXNfdG9fbWFjaGluZSh2aXJ0X3RvX3Bmbih2YWRkciksIG1mbik7Ci0JfQotCi0J eGVuX21jX2lzc3VlKDApOwotfQotCi0vKgotICogUGVyZm9ybSB0aGUgaHlwZXJjYWxsIHRvIGV4 Y2hhbmdlIGEgcmVnaW9uIG9mIG91ciBwZm5zIHRvIHBvaW50IHRvCi0gKiBtZW1vcnkgd2l0aCB0 aGUgcmVxdWlyZWQgY29udGlndW91cyBhbGlnbm1lbnQuICBUYWtlcyB0aGUgcGZucyBhcwotICog aW5wdXQsIGFuZCBwb3B1bGF0ZXMgbWZucyBhcyBvdXRwdXQuCi0gKgotICogUmV0dXJucyBhIHN1 Y2Nlc3MgY29kZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGh5cGVydmlzb3Igd2FzIGFibGUgdG8K LSAqIHNhdGlzZnkgdGhlIHJlcXVlc3Qgb3Igbm90LgotICovCi1zdGF0aWMgaW50IHhlbl9leGNo YW5nZV9tZW1vcnkodW5zaWduZWQgbG9uZyBleHRlbnRzX2luLCB1bnNpZ25lZCBpbnQgb3JkZXJf aW4sCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyAqcGZuc19pbiwKLQkJCSAgICAgICB1bnNpZ25l ZCBsb25nIGV4dGVudHNfb3V0LAotCQkJICAgICAgIHVuc2lnbmVkIGludCBvcmRlcl9vdXQsCi0J CQkgICAgICAgdW5zaWduZWQgbG9uZyAqbWZuc19vdXQsCi0JCQkgICAgICAgdW5zaWduZWQgaW50 IGFkZHJlc3NfYml0cykKLXsKLQlsb25nIHJjOwotCWludCBzdWNjZXNzOwotCi0Jc3RydWN0IHhl bl9tZW1vcnlfZXhjaGFuZ2UgZXhjaGFuZ2UgPSB7Ci0JCS5pbiA9IHsKLQkJCS5ucl9leHRlbnRz ICAgPSBleHRlbnRzX2luLAotCQkJLmV4dGVudF9vcmRlciA9IG9yZGVyX2luLAotCQkJLmV4dGVu dF9zdGFydCA9IHBmbnNfaW4sCi0JCQkuZG9taWQgICAgICAgID0gRE9NSURfU0VMRgotCQl9LAot CQkub3V0ID0gewotCQkJLm5yX2V4dGVudHMgICA9IGV4dGVudHNfb3V0LAotCQkJLmV4dGVudF9v cmRlciA9IG9yZGVyX291dCwKLQkJCS5leHRlbnRfc3RhcnQgPSBtZm5zX291dCwKLQkJCS5hZGRy ZXNzX2JpdHMgPSBhZGRyZXNzX2JpdHMsCi0JCQkuZG9taWQgICAgICAgID0gRE9NSURfU0VMRgot CQl9Ci0JfTsKLQotCUJVR19PTihleHRlbnRzX2luIDw8IG9yZGVyX2luICE9IGV4dGVudHNfb3V0 IDw8IG9yZGVyX291dCk7Ci0KLQlyYyA9IEhZUEVSVklTT1JfbWVtb3J5X29wKFhFTk1FTV9leGNo YW5nZSwgJmV4Y2hhbmdlKTsKLQlzdWNjZXNzID0gKGV4Y2hhbmdlLm5yX2V4Y2hhbmdlZCA9PSBl eHRlbnRzX2luKTsKLQotCUJVR19PTighc3VjY2VzcyAmJiAoKGV4Y2hhbmdlLm5yX2V4Y2hhbmdl ZCAhPSAwKSB8fCAocmMgPT0gMCkpKTsKLQlCVUdfT04oc3VjY2VzcyAmJiAocmMgIT0gMCkpOwot Ci0JcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLWludCB4ZW5fY3JlYXRlX2NvbnRpZ3VvdXNfcmVnaW9u KHBoeXNfYWRkcl90IHBzdGFydCwgdW5zaWduZWQgaW50IG9yZGVyLAotCQkJCSB1bnNpZ25lZCBp bnQgYWRkcmVzc19iaXRzLAotCQkJCSBkbWFfYWRkcl90ICpkbWFfaGFuZGxlKQotewotCXVuc2ln bmVkIGxvbmcgKmluX2ZyYW1lcyA9IGRpc2NvbnRpZ19mcmFtZXMsIG91dF9mcmFtZTsKLQl1bnNp Z25lZCBsb25nICBmbGFnczsKLQlpbnQgICAgICAgICAgICBzdWNjZXNzOwotCXVuc2lnbmVkIGxv bmcgdnN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHBzdGFydCk7Ci0KLQkvKgot CSAqIEN1cnJlbnRseSBhbiBhdXRvLXRyYW5zbGF0ZWQgZ3Vlc3Qgd2lsbCBub3QgcGVyZm9ybSBJ L08sIG5vciB3aWxsCi0JICogaXQgcmVxdWlyZSBQQUUgcGFnZSBkaXJlY3RvcmllcyBiZWxvdyA0 R0IuIFRoZXJlZm9yZSBhbnkgY2FsbHMgdG8KLQkgKiB0aGlzIGZ1bmN0aW9uIGFyZSByZWR1bmRh bnQgYW5kIGNhbiBiZSBpZ25vcmVkLgotCSAqLwotCi0JaWYgKHhlbl9mZWF0dXJlKFhFTkZFQVRf YXV0b190cmFuc2xhdGVkX3BoeXNtYXApKQotCQlyZXR1cm4gMDsKLQotCWlmICh1bmxpa2VseShv cmRlciA+IE1BWF9DT05USUdfT1JERVIpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1lbXNldCgo dm9pZCAqKSB2c3RhcnQsIDAsIFBBR0VfU0laRSA8PCBvcmRlcik7Ci0KLQlzcGluX2xvY2tfaXJx c2F2ZSgmeGVuX3Jlc2VydmF0aW9uX2xvY2ssIGZsYWdzKTsKLQotCS8qIDEuIFphcCBjdXJyZW50 IFBURXMsIHJlbWVtYmVyaW5nIE1GTnMuICovCi0JeGVuX3phcF9wZm5fcmFuZ2UodnN0YXJ0LCBv cmRlciwgaW5fZnJhbWVzLCBOVUxMKTsKLQotCS8qIDIuIEdldCBhIG5ldyBjb250aWd1b3VzIG1l bW9yeSBleHRlbnQuICovCi0Jb3V0X2ZyYW1lID0gdmlydF90b19wZm4odnN0YXJ0KTsKLQlzdWNj ZXNzID0geGVuX2V4Y2hhbmdlX21lbW9yeSgxVUwgPDwgb3JkZXIsIDAsIGluX2ZyYW1lcywKLQkJ CQkgICAgICAxLCBvcmRlciwgJm91dF9mcmFtZSwKLQkJCQkgICAgICBhZGRyZXNzX2JpdHMpOwot Ci0JLyogMy4gTWFwIHRoZSBuZXcgZXh0ZW50IGluIHBsYWNlIG9mIG9sZCBwYWdlcy4gKi8KLQlp ZiAoc3VjY2VzcykKLQkJeGVuX3JlbWFwX2V4Y2hhbmdlZF9wdGVzKHZzdGFydCwgb3JkZXIsIE5V TEwsIG91dF9mcmFtZSk7Ci0JZWxzZQotCQl4ZW5fcmVtYXBfZXhjaGFuZ2VkX3B0ZXModnN0YXJ0 LCBvcmRlciwgaW5fZnJhbWVzLCAwKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhlbl9y ZXNlcnZhdGlvbl9sb2NrLCBmbGFncyk7Ci0KLQkqZG1hX2hhbmRsZSA9IHZpcnRfdG9fbWFjaGlu ZSh2c3RhcnQpLm1hZGRyOwotCXJldHVybiBzdWNjZXNzID8gMCA6IC1FTk9NRU07Ci19Ci1FWFBP UlRfU1lNQk9MX0dQTCh4ZW5fY3JlYXRlX2NvbnRpZ3VvdXNfcmVnaW9uKTsKLQotdm9pZCB4ZW5f ZGVzdHJveV9jb250aWd1b3VzX3JlZ2lvbihwaHlzX2FkZHJfdCBwc3RhcnQsIHVuc2lnbmVkIGlu dCBvcmRlcikKLXsKLQl1bnNpZ25lZCBsb25nICpvdXRfZnJhbWVzID0gZGlzY29udGlnX2ZyYW1l cywgaW5fZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyAgZmxhZ3M7Ci0JaW50IHN1Y2Nlc3M7Ci0JdW5z aWduZWQgbG9uZyB2c3RhcnQ7Ci0KLQlpZiAoeGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3RyYW5z bGF0ZWRfcGh5c21hcCkpCi0JCXJldHVybjsKLQotCWlmICh1bmxpa2VseShvcmRlciA+IE1BWF9D T05USUdfT1JERVIpKQotCQlyZXR1cm47Ci0KLQl2c3RhcnQgPSAodW5zaWduZWQgbG9uZylwaHlz X3RvX3ZpcnQocHN0YXJ0KTsKLQltZW1zZXQoKHZvaWQgKikgdnN0YXJ0LCAwLCBQQUdFX1NJWkUg PDwgb3JkZXIpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnhlbl9yZXNlcnZhdGlvbl9sb2NrLCBm bGFncyk7Ci0KLQkvKiAxLiBGaW5kIHN0YXJ0IE1GTiBvZiBjb250aWd1b3VzIGV4dGVudC4gKi8K LQlpbl9mcmFtZSA9IHZpcnRfdG9fbWZuKHZzdGFydCk7Ci0KLQkvKiAyLiBaYXAgY3VycmVudCBQ VEVzLiAqLwotCXhlbl96YXBfcGZuX3JhbmdlKHZzdGFydCwgb3JkZXIsIE5VTEwsIG91dF9mcmFt ZXMpOwotCi0JLyogMy4gRG8gdGhlIGV4Y2hhbmdlIGZvciBub24tY29udGlndW91cyBNRk5zLiAq LwotCXN1Y2Nlc3MgPSB4ZW5fZXhjaGFuZ2VfbWVtb3J5KDEsIG9yZGVyLCAmaW5fZnJhbWUsIDFV TCA8PCBvcmRlciwKLQkJCQkJMCwgb3V0X2ZyYW1lcywgMCk7Ci0KLQkvKiA0LiBNYXAgbmV3IHBh Z2VzIGluIHBsYWNlIG9mIG9sZCBwYWdlcy4gKi8KLQlpZiAoc3VjY2VzcykKLQkJeGVuX3JlbWFw X2V4Y2hhbmdlZF9wdGVzKHZzdGFydCwgb3JkZXIsIG91dF9mcmFtZXMsIDApOwotCWVsc2UKLQkJ eGVuX3JlbWFwX2V4Y2hhbmdlZF9wdGVzKHZzdGFydCwgb3JkZXIsIE5VTEwsIGluX2ZyYW1lKTsK LQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhlbl9yZXNlcnZhdGlvbl9sb2NrLCBmbGFncyk7 Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh4ZW5fZGVzdHJveV9jb250aWd1b3VzX3JlZ2lvbik7Ci0K LSNpZmRlZiBDT05GSUdfWEVOX1BWSFZNCi0jaWZkZWYgQ09ORklHX1BST0NfVk1DT1JFCi0vKgot ICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIHR3byBjb250ZXh0czoKLSAqIC0gdGhlIGtkdW1w IGtlcm5lbCBoYXMgdG8gY2hlY2sgd2hldGhlciBhIHBmbiBvZiB0aGUgY3Jhc2hlZCBrZXJuZWwK LSAqICAgd2FzIGEgYmFsbG9vbmVkIHBhZ2UuIHZtY29yZSBpcyB1c2luZyB0aGlzIGZ1bmN0aW9u IHRvIGRlY2lkZQotICogICB3aGV0aGVyIHRvIGFjY2VzcyBhIHBmbiBvZiB0aGUgY3Jhc2hlZCBr ZXJuZWwuCi0gKiAtIHRoZSBrZXhlYyBrZXJuZWwgaGFzIHRvIGNoZWNrIHdoZXRoZXIgYSBwZm4g d2FzIGJhbGxvb25lZCBieSB0aGUKLSAqICAgcHJldmlvdXMga2VybmVsLiBJZiB0aGUgcGZuIGlz IGJhbGxvb25lZCwgaGFuZGxlIGl0IHByb3Blcmx5LgotICogUmV0dXJucyAwIGlmIHRoZSBwZm4g aXMgbm90IGJhY2tlZCBieSBhIFJBTSBwYWdlLCB0aGUgY2FsbGVyIG1heQotICogaGFuZGxlIHRo ZSBwZm4gc3BlY2lhbCBpbiB0aGlzIGNhc2UuCi0gKi8KLXN0YXRpYyBpbnQgeGVuX29sZG1lbV9w Zm5faXNfcmFtKHVuc2lnbmVkIGxvbmcgcGZuKQotewotCXN0cnVjdCB4ZW5faHZtX2dldF9tZW1f dHlwZSBhID0gewotCQkuZG9taWQgPSBET01JRF9TRUxGLAotCQkucGZuID0gcGZuLAotCX07Ci0J aW50IHJhbTsKLQotCWlmIChIWVBFUlZJU09SX2h2bV9vcChIVk1PUF9nZXRfbWVtX3R5cGUsICZh KSkKLQkJcmV0dXJuIC1FTlhJTzsKLQotCXN3aXRjaCAoYS5tZW1fdHlwZSkgewotCQljYXNlIEhW TU1FTV9tbWlvX2RtOgotCQkJcmFtID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIEhWTU1FTV9yYW1f cnc6Ci0JCWNhc2UgSFZNTUVNX3JhbV9ybzoKLQkJZGVmYXVsdDoKLQkJCXJhbSA9IDE7Ci0JCQli cmVhazsKLQl9Ci0KLQlyZXR1cm4gcmFtOwotfQotI2VuZGlmCisJdHJhY2VfeGVuX21tdV9mbHVz aF90bGJfYWxsKDApOwogCi1zdGF0aWMgdm9pZCB4ZW5faHZtX2V4aXRfbW1hcChzdHJ1Y3QgbW1f c3RydWN0ICptbSkKLXsKLQlzdHJ1Y3QgeGVuX2h2bV9wYWdldGFibGVfZHlpbmcgYTsKLQlpbnQg cmM7CisJcHJlZW1wdF9kaXNhYmxlKCk7CiAKLQlhLmRvbWlkID0gRE9NSURfU0VMRjsKLQlhLmdw YSA9IF9fcGEobW0tPnBnZCk7Ci0JcmMgPSBIWVBFUlZJU09SX2h2bV9vcChIVk1PUF9wYWdldGFi bGVfZHlpbmcsICZhKTsKLQlXQVJOX09OX09OQ0UocmMgPCAwKTsKLX0KKwltY3MgPSB4ZW5fbWNf ZW50cnkoc2l6ZW9mKCpvcCkpOwogCi1zdGF0aWMgaW50IGlzX3BhZ2V0YWJsZV9keWluZ19zdXBw b3J0ZWQodm9pZCkKLXsKLQlzdHJ1Y3QgeGVuX2h2bV9wYWdldGFibGVfZHlpbmcgYTsKLQlpbnQg cmMgPSAwOworCW9wID0gbWNzLmFyZ3M7CisJb3AtPmNtZCA9IE1NVUVYVF9UTEJfRkxVU0hfQUxM OworCU1VTFRJX21tdWV4dF9vcChtY3MubWMsIG9wLCAxLCBOVUxMLCBET01JRF9TRUxGKTsKIAot CWEuZG9taWQgPSBET01JRF9TRUxGOwotCWEuZ3BhID0gMHgwMDsKLQlyYyA9IEhZUEVSVklTT1Jf aHZtX29wKEhWTU9QX3BhZ2V0YWJsZV9keWluZywgJmEpOwotCWlmIChyYyA8IDApIHsKLQkJcHJp bnRrKEtFUk5fREVCVUcgIkhWTU9QX3BhZ2V0YWJsZV9keWluZyBub3Qgc3VwcG9ydGVkXG4iKTsK LQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOwotfQorCXhlbl9tY19pc3N1ZShQQVJBVklSVF9M QVpZX01NVSk7CiAKLXZvaWQgX19pbml0IHhlbl9odm1faW5pdF9tbXVfb3BzKHZvaWQpCi17Ci0J aWYgKGlzX3BhZ2V0YWJsZV9keWluZ19zdXBwb3J0ZWQoKSkKLQkJcHZfbW11X29wcy5leGl0X21t YXAgPSB4ZW5faHZtX2V4aXRfbW1hcDsKLSNpZmRlZiBDT05GSUdfUFJPQ19WTUNPUkUKLQlyZWdp c3Rlcl9vbGRtZW1fcGZuX2lzX3JhbSgmeGVuX29sZG1lbV9wZm5faXNfcmFtKTsKLSNlbmRpZgor CXByZWVtcHRfZW5hYmxlKCk7CiB9Ci0jZW5kaWYKIAogI2RlZmluZSBSRU1BUF9CQVRDSF9TSVpF IDE2CiAKQEAgLTI4OTQsNyArMTkxLDYgQEAgaW50IHhlbl9yZW1hcF9kb21haW5fZ2ZuX2FycmF5 KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogfQogRVhQT1JUX1NZTUJPTF9HUEwoeGVuX3Jl bWFwX2RvbWFpbl9nZm5fYXJyYXkpOwogCi0KIC8qIFJldHVybnM6IDAgc3VjY2VzcyAqLwogaW50 IHhlbl91bm1hcF9kb21haW5fZ2ZuX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAog CQkJICAgICAgIGludCBudW1wZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpCmRpZmYgLS1naXQgYS9h cmNoL3g4Ni94ZW4vbW11X2h2bS5jIGIvYXJjaC94ODYveGVuL21tdV9odm0uYwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGVjYjkyCi0tLSAvZGV2L251bGwKKysrIGIvYXJj aC94ODYveGVuL21tdV9odm0uYwpAQCAtMCwwICsxLDc3IEBACisjaW5jbHVkZSA8bGludXgvdHlw ZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmFzaF9kdW1wLmg+CisKKyNpbmNsdWRlIDx4ZW4vaW50 ZXJmYWNlL3hlbi5oPgorI2luY2x1ZGUgPHhlbi9odm0uaD4KKworI2lmZGVmIENPTkZJR19QUk9D X1ZNQ09SRQorLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiB0d28gY29udGV4dHM6Cisg KiAtIHRoZSBrZHVtcCBrZXJuZWwgaGFzIHRvIGNoZWNrIHdoZXRoZXIgYSBwZm4gb2YgdGhlIGNy YXNoZWQga2VybmVsCisgKiAgIHdhcyBhIGJhbGxvb25lZCBwYWdlLiB2bWNvcmUgaXMgdXNpbmcg dGhpcyBmdW5jdGlvbiB0byBkZWNpZGUKKyAqICAgd2hldGhlciB0byBhY2Nlc3MgYSBwZm4gb2Yg dGhlIGNyYXNoZWQga2VybmVsLgorICogLSB0aGUga2V4ZWMga2VybmVsIGhhcyB0byBjaGVjayB3 aGV0aGVyIGEgcGZuIHdhcyBiYWxsb29uZWQgYnkgdGhlCisgKiAgIHByZXZpb3VzIGtlcm5lbC4g SWYgdGhlIHBmbiBpcyBiYWxsb29uZWQsIGhhbmRsZSBpdCBwcm9wZXJseS4KKyAqIFJldHVybnMg MCBpZiB0aGUgcGZuIGlzIG5vdCBiYWNrZWQgYnkgYSBSQU0gcGFnZSwgdGhlIGNhbGxlciBtYXkK KyAqIGhhbmRsZSB0aGUgcGZuIHNwZWNpYWwgaW4gdGhpcyBjYXNlLgorICovCitzdGF0aWMgaW50 IHhlbl9vbGRtZW1fcGZuX2lzX3JhbSh1bnNpZ25lZCBsb25nIHBmbikKK3sKKwlzdHJ1Y3QgeGVu X2h2bV9nZXRfbWVtX3R5cGUgYSA9IHsKKwkJLmRvbWlkID0gRE9NSURfU0VMRiwKKwkJLnBmbiA9 IHBmbiwKKwl9OworCWludCByYW07CisKKwlpZiAoSFlQRVJWSVNPUl9odm1fb3AoSFZNT1BfZ2V0 X21lbV90eXBlLCAmYSkpCisJCXJldHVybiAtRU5YSU87CisKKwlzd2l0Y2ggKGEubWVtX3R5cGUp IHsKKwljYXNlIEhWTU1FTV9tbWlvX2RtOgorCQlyYW0gPSAwOworCQlicmVhazsKKwljYXNlIEhW TU1FTV9yYW1fcnc6CisJY2FzZSBIVk1NRU1fcmFtX3JvOgorCWRlZmF1bHQ6CisJCXJhbSA9IDE7 CisJCWJyZWFrOworCX0KKworCXJldHVybiByYW07Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQg eGVuX2h2bV9leGl0X21tYXAoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJc3RydWN0IHhlbl9o dm1fcGFnZXRhYmxlX2R5aW5nIGE7CisJaW50IHJjOworCisJYS5kb21pZCA9IERPTUlEX1NFTEY7 CisJYS5ncGEgPSBfX3BhKG1tLT5wZ2QpOworCXJjID0gSFlQRVJWSVNPUl9odm1fb3AoSFZNT1Bf cGFnZXRhYmxlX2R5aW5nLCAmYSk7CisJV0FSTl9PTl9PTkNFKHJjIDwgMCk7Cit9CisKK3N0YXRp YyBpbnQgaXNfcGFnZXRhYmxlX2R5aW5nX3N1cHBvcnRlZCh2b2lkKQoreworCXN0cnVjdCB4ZW5f aHZtX3BhZ2V0YWJsZV9keWluZyBhOworCWludCByYyA9IDA7CisKKwlhLmRvbWlkID0gRE9NSURf U0VMRjsKKwlhLmdwYSA9IDB4MDA7CisJcmMgPSBIWVBFUlZJU09SX2h2bV9vcChIVk1PUF9wYWdl dGFibGVfZHlpbmcsICZhKTsKKwlpZiAocmMgPCAwKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJI Vk1PUF9wYWdldGFibGVfZHlpbmcgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAwOworCX0K KwlyZXR1cm4gMTsKK30KKwordm9pZCBfX2luaXQgeGVuX2h2bV9pbml0X21tdV9vcHModm9pZCkK K3sKKwlpZiAoaXNfcGFnZXRhYmxlX2R5aW5nX3N1cHBvcnRlZCgpKQorCQlwdl9tbXVfb3BzLmV4 aXRfbW1hcCA9IHhlbl9odm1fZXhpdF9tbWFwOworI2lmZGVmIENPTkZJR19QUk9DX1ZNQ09SRQor CXJlZ2lzdGVyX29sZG1lbV9wZm5faXNfcmFtKCZ4ZW5fb2xkbWVtX3Bmbl9pc19yYW0pOworI2Vu ZGlmCit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vbW11X3B2LmMgYi9hcmNoL3g4Ni94ZW4v bW11X3B2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBiNTM2MgotLS0g L2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3hlbi9tbXVfcHYuYwpAQCAtMCwwICsxLDI2MzYgQEAK Ky8qCisgKiBYZW4gbW11IG9wZXJhdGlvbnMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhl IHZhcmlvdXMgbW11IGZldGNoIGFuZCB1cGRhdGUgb3BlcmF0aW9ucy4KKyAqIFRoZSBtb3N0IGlt cG9ydGFudCBqb2IgdGhleSBtdXN0IHBlcmZvcm0gaXMgdGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUK KyAqIGRvbWFpbidzIHBmbiBhbmQgdGhlIG92ZXJhbGwgbWFjaGluZSBtZm5zLgorICoKKyAqIFhl biBhbGxvd3MgZ3Vlc3RzIHRvIGRpcmVjdGx5IHVwZGF0ZSB0aGUgcGFnZXRhYmxlLCBpbiBhIGNv bnRyb2xsZWQKKyAqIGZhc2hpb24uICBJbiBvdGhlciB3b3JkcywgdGhlIGd1ZXN0IG1vZGlmaWVz IHRoZSBzYW1lIHBhZ2V0YWJsZQorICogdGhhdCB0aGUgQ1BVIGFjdHVhbGx5IHVzZXMsIHdoaWNo IGVsaW1pbmF0ZXMgdGhlIG92ZXJoZWFkIG9mIGhhdmluZworICogYSBzZXBhcmF0ZSBzaGFkb3cg cGFnZXRhYmxlLgorICoKKyAqIEluIG9yZGVyIHRvIGFsbG93IHRoaXMsIGl0IGZhbGxzIG9uIHRo ZSBndWVzdCBkb21haW4gdG8gbWFwIGl0cworICogbm90aW9uIG9mIGEgInBoeXNpY2FsIiBwZm4g LSB3aGljaCBpcyBqdXN0IGEgZG9tYWluLWxvY2FsIGxpbmVhcgorICogYWRkcmVzcyAtIGludG8g YSByZWFsICJtYWNoaW5lIGFkZHJlc3MiIHdoaWNoIHRoZSBDUFUncyBNTVUgY2FuCisgKiB1c2Uu CisgKgorICogQSBwZ2RfdC9wbWRfdC9wdGVfdCB3aWxsIHR5cGljYWxseSBjb250YWluIGFuIG1m biwgYW5kIHNvIGNhbiBiZQorICogaW5zZXJ0ZWQgZGlyZWN0bHkgaW50byB0aGUgcGFnZXRhYmxl LiAgV2hlbiBjcmVhdGluZyBhIG5ldworICogcHRlL3BtZC9wZ2QsIGl0IGNvbnZlcnRzIHRoZSBw YXNzZWQgcGZuIGludG8gYW4gbWZuLiAgQ29udmVyc2VseSwKKyAqIHdoZW4gcmVhZGluZyB0aGUg Y29udGVudCBiYWNrIHdpdGggX18ocGdkfHBtZHxwdGUpX3ZhbCwgaXQgY29udmVydHMKKyAqIHRo ZSBtZm4gYmFjayBpbnRvIGEgcGZuLgorICoKKyAqIFRoZSBvdGhlciBjb25zdHJhaW50IGlzIHRo YXQgYWxsIHBhZ2VzIHdoaWNoIG1ha2UgdXAgYSBwYWdldGFibGUKKyAqIG11c3QgYmUgbWFwcGVk IHJlYWQtb25seSBpbiB0aGUgZ3Vlc3QuICBUaGlzIHByZXZlbnRzIHVuY29udHJvbGxlZAorICog Z3Vlc3QgdXBkYXRlcyB0byB0aGUgcGFnZXRhYmxlLiAgWGVuIHN0cmljdGx5IGVuZm9yY2VzIHRo aXMsIGFuZAorICogd2lsbCBkaXNhbGxvdyBhbnkgcGFnZXRhYmxlIHVwZGF0ZSB3aGljaCB3aWxs IGVuZCB1cCBtYXBwaW5nIGEKKyAqIHBhZ2V0YWJsZSBwYWdlIFJXLCBhbmQgd2lsbCBkaXNhbGxv dyB1c2luZyBhbnkgd3JpdGFibGUgcGFnZSBhcyBhCisgKiBwYWdldGFibGUuCisgKgorICogTmFp dmVseSwgd2hlbiBsb2FkaW5nICVjcjMgd2l0aCB0aGUgYmFzZSBvZiBhIG5ldyBwYWdldGFibGUs IFhlbgorICogd291bGQgbmVlZCB0byB2YWxpZGF0ZSB0aGUgd2hvbGUgcGFnZXRhYmxlIGJlZm9y ZSBnb2luZyBvbi4KKyAqIE5hdHVyYWxseSwgdGhpcyBpcyBxdWl0ZSBzbG93LiAgVGhlIHNvbHV0 aW9uIGlzIHRvICJwaW4iIGEKKyAqIHBhZ2V0YWJsZSwgd2hpY2ggZW5mb3JjZXMgYWxsIHRoZSBj b25zdHJhaW50cyBvbiB0aGUgcGFnZXRhYmxlIGV2ZW4KKyAqIHdoZW4gaXQgaXMgbm90IGFjdGl2 ZWx5IGluIHVzZS4gIFRoaXMgbWVuYXMgdGhhdCBYZW4gY2FuIGJlIGFzc3VyZWQKKyAqIHRoYXQg aXQgaXMgc3RpbGwgdmFsaWQgd2hlbiB5b3UgZG8gbG9hZCBpdCBpbnRvICVjcjMsIGFuZCBkb2Vz bid0CisgKiBuZWVkIHRvIHJldmFsaWRhdGUgaXQuCisgKgorICogSmVyZW15IEZpdHpoYXJkaW5n ZSA8amVyZW15QHhlbnNvdXJjZS5jb20+LCBYZW5Tb3VyY2UgSW5jLCAyMDA3CisgKi8KKyNpbmNs dWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRl IDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGlu dXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4 L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1ibG9j ay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNpbmNsdWRlIDx0cmFjZS9ldmVu dHMveGVuLmg+CisKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS90bGJm bHVzaC5oPgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRl eHQuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vcGFyYXZpcnQuaD4K KyNpbmNsdWRlIDxhc20vZTgyMC5oPgorI2luY2x1ZGUgPGFzbS9saW5rYWdlLmg+CisjaW5jbHVk ZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9wYXQu aD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisKKyNpbmNsdWRlIDxhc20veGVuL2h5cGVyY2FsbC5o PgorI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgorCisjaW5jbHVkZSA8eGVuL3hlbi5o PgorI2luY2x1ZGUgPHhlbi9wYWdlLmg+CisjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS94ZW4uaD4K KyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL2h2bS9odm1fb3AuaD4KKyNpbmNsdWRlIDx4ZW4vaW50 ZXJmYWNlL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL21lbW9yeS5oPgorI2lu Y2x1ZGUgPHhlbi9odmMtY29uc29sZS5oPgorCisjaW5jbHVkZSAibXVsdGljYWxscy5oIgorI2lu Y2x1ZGUgIm1tdS5oIgorI2luY2x1ZGUgImRlYnVnZnMuaCIKKworI2lmZGVmIENPTkZJR19YODZf MzIKKy8qCisgKiBJZGVudGl0eSBtYXAsIGluIGFkZGl0aW9uIHRvIHBsYWluIGtlcm5lbCBtYXAu ICBUaGlzIG5lZWRzIHRvIGJlCisgKiBsYXJnZSBlbm91Z2ggdG8gYWxsb2NhdGUgcGFnZSB0YWJs ZSBwYWdlcyB0byBhbGxvY2F0ZSB0aGUgcmVzdC4KKyAqIEVhY2ggcGFnZSBjYW4gbWFwIDJNQi4K KyAqLworI2RlZmluZSBMRVZFTDFfSURFTlRfRU5UUklFUwkoUFRSU19QRVJfUFRFICogNCkKK3N0 YXRpYyBSRVNFUlZFX0JSS19BUlJBWShwdGVfdCwgbGV2ZWwxX2lkZW50X3BndCwgTEVWRUwxX0lE RU5UX0VOVFJJRVMpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1g4Nl82NAorLyogbDMgcHVkIGZv ciB1c2Vyc3BhY2UgdnN5c2NhbGwgbWFwcGluZyAqLworc3RhdGljIHB1ZF90IGxldmVsM191c2Vy X3ZzeXNjYWxsW1BUUlNfUEVSX1BVRF0gX19wYWdlX2FsaWduZWRfYnNzOworI2VuZGlmIC8qIENP TkZJR19YODZfNjQgKi8KKworLyoKKyAqIE5vdGUgYWJvdXQgY3IzIChwYWdldGFibGUgYmFzZSkg dmFsdWVzOgorICoKKyAqIHhlbl9jcjMgY29udGFpbnMgdGhlIGN1cnJlbnQgbG9naWNhbCBjcjMg dmFsdWU7IGl0IGNvbnRhaW5zIHRoZQorICogbGFzdCBzZXQgY3IzLiAgVGhpcyBtYXkgbm90IGJl IHRoZSBjdXJyZW50IGVmZmVjdGl2ZSBjcjMsIGJlY2F1c2UKKyAqIGl0cyB1cGRhdGUgbWF5IGJl IGJlaW5nIGxhemlseSBkZWZlcnJlZC4gIEhvd2V2ZXIsIGEgdmNwdSBsb29raW5nCisgKiBhdCBp dHMgb3duIGNyMyBjYW4gdXNlIHRoaXMgdmFsdWUga25vd2luZyB0aGF0IGl0IGV2ZXJ5dGhpbmcg d2lsbAorICogYmUgc2VsZi1jb25zaXN0ZW50LgorICoKKyAqIHhlbl9jdXJyZW50X2NyMyBjb250 YWlucyB0aGUgYWN0dWFsIHZjcHUgY3IzOyBpdCBpcyBzZXQgb25jZSB0aGUKKyAqIGh5cGVyY2Fs bCB0byBzZXQgdGhlIHZjcHUgY3IzIGlzIGNvbXBsZXRlIChzbyBpdCBtYXkgYmUgYSBsaXR0bGUK KyAqIG91dCBvZiBkYXRlLCBidXQgaXQgd2lsbCBuZXZlciBiZSBzZXQgZWFybHkpLiAgSWYgb25l IHZjcHUgaXMKKyAqIGxvb2tpbmcgYXQgYW5vdGhlciB2Y3B1J3MgY3IzIHZhbHVlLCBpdCBzaG91 bGQgdXNlIHRoaXMgdmFyaWFibGUuCisgKi8KK0RFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcs IHhlbl9jcjMpOwkgLyogY3IzIHN0b3JlZCBhcyBwaHlzYWRkciAqLworREVGSU5FX1BFUl9DUFUo dW5zaWduZWQgbG9uZywgeGVuX2N1cnJlbnRfY3IzKTsJIC8qIGFjdHVhbCB2Y3B1IGNyMyAqLwor CitzdGF0aWMgcGh5c19hZGRyX3QgeGVuX3B0X2Jhc2UsIHhlbl9wdF9zaXplIF9faW5pdGRhdGE7 CisKKy8qCisgKiBKdXN0IGJleW9uZCB0aGUgaGlnaGVzdCB1c2VybW9kZSBhZGRyZXNzLiAgU1RB Q0tfVE9QX01BWCBoYXMgYQorICogcmVkem9uZSBhYm92ZSBpdCwgc28gcm91bmQgaXQgdXAgdG8g YSBQR0QgYm91bmRhcnkuCisgKi8KKyNkZWZpbmUgVVNFUl9MSU1JVAkoKFNUQUNLX1RPUF9NQVgg KyBQR0RJUl9TSVpFIC0gMSkgJiBQR0RJUl9NQVNLKQorCit2b2lkIG1ha2VfbG93bWVtX3BhZ2Vf cmVhZG9ubHkodm9pZCAqdmFkZHIpCit7CisJcHRlX3QgKnB0ZSwgcHRldjsKKwl1bnNpZ25lZCBs b25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZyl2YWRkcjsKKwl1bnNpZ25lZCBpbnQgbGV2ZWw7 CisKKwlwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyZXNzLCAmbGV2ZWwpOworCWlmIChwdGUgPT0g TlVMTCkKKwkJcmV0dXJuOwkJLyogdmFkZHIgbWlzc2luZyAqLworCisJcHRldiA9IHB0ZV93cnBy b3RlY3QoKnB0ZSk7CisKKwlpZiAoSFlQRVJWSVNPUl91cGRhdGVfdmFfbWFwcGluZyhhZGRyZXNz LCBwdGV2LCAwKSkKKwkJQlVHKCk7Cit9CisKK3ZvaWQgbWFrZV9sb3dtZW1fcGFnZV9yZWFkd3Jp dGUodm9pZCAqdmFkZHIpCit7CisJcHRlX3QgKnB0ZSwgcHRldjsKKwl1bnNpZ25lZCBsb25nIGFk ZHJlc3MgPSAodW5zaWduZWQgbG9uZyl2YWRkcjsKKwl1bnNpZ25lZCBpbnQgbGV2ZWw7CisKKwlw dGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyZXNzLCAmbGV2ZWwpOworCWlmIChwdGUgPT0gTlVMTCkK KwkJcmV0dXJuOwkJLyogdmFkZHIgbWlzc2luZyAqLworCisJcHRldiA9IHB0ZV9ta3dyaXRlKCpw dGUpOworCisJaWYgKEhZUEVSVklTT1JfdXBkYXRlX3ZhX21hcHBpbmcoYWRkcmVzcywgcHRldiwg MCkpCisJCUJVRygpOworfQorCisKK3N0YXRpYyBib29sIHhlbl9wYWdlX3Bpbm5lZCh2b2lkICpw dHIpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocHRyKTsKKworCXJldHVy biBQYWdlUGlubmVkKHBhZ2UpOworfQorCit2b2lkIHhlbl9zZXRfZG9tYWluX3B0ZShwdGVfdCAq cHRlcCwgcHRlX3QgcHRldmFsLCB1bnNpZ25lZCBkb21pZCkKK3sKKwlzdHJ1Y3QgbXVsdGljYWxs X3NwYWNlIG1jczsKKwlzdHJ1Y3QgbW11X3VwZGF0ZSAqdTsKKworCXRyYWNlX3hlbl9tbXVfc2V0 X2RvbWFpbl9wdGUocHRlcCwgcHRldmFsLCBkb21pZCk7CisKKwltY3MgPSB4ZW5fbWNfZW50cnko c2l6ZW9mKCp1KSk7CisJdSA9IG1jcy5hcmdzOworCisJLyogcHRlcCBtaWdodCBiZSBrbWFwcGVk IHdoZW4gdXNpbmcgMzItYml0IEhJR0hQVEUgKi8KKwl1LT5wdHIgPSB2aXJ0X3RvX21hY2hpbmUo cHRlcCkubWFkZHI7CisJdS0+dmFsID0gcHRlX3ZhbF9tYShwdGV2YWwpOworCisJTVVMVElfbW11 X3VwZGF0ZShtY3MubWMsIG1jcy5hcmdzLCAxLCBOVUxMLCBkb21pZCk7CisKKwl4ZW5fbWNfaXNz dWUoUEFSQVZJUlRfTEFaWV9NTVUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoeGVuX3NldF9kb21h aW5fcHRlKTsKKworc3RhdGljIHZvaWQgeGVuX2V4dGVuZF9tbXVfdXBkYXRlKGNvbnN0IHN0cnVj dCBtbXVfdXBkYXRlICp1cGRhdGUpCit7CisJc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7CisJ c3RydWN0IG1tdV91cGRhdGUgKnU7CisKKwltY3MgPSB4ZW5fbWNfZXh0ZW5kX2FyZ3MoX19IWVBF UlZJU09SX21tdV91cGRhdGUsIHNpemVvZigqdSkpOworCisJaWYgKG1jcy5tYyAhPSBOVUxMKSB7 CisJCW1jcy5tYy0+YXJnc1sxXSsrOworCX0gZWxzZSB7CisJCW1jcyA9IF9feGVuX21jX2VudHJ5 KHNpemVvZigqdSkpOworCQlNVUxUSV9tbXVfdXBkYXRlKG1jcy5tYywgbWNzLmFyZ3MsIDEsIE5V TEwsIERPTUlEX1NFTEYpOworCX0KKworCXUgPSBtY3MuYXJnczsKKwkqdSA9ICp1cGRhdGU7Cit9 CisKK3N0YXRpYyB2b2lkIHhlbl9leHRlbmRfbW11ZXh0X29wKGNvbnN0IHN0cnVjdCBtbXVleHRf b3AgKm9wKQoreworCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzOworCXN0cnVjdCBtbXVleHRf b3AgKnU7CisKKwltY3MgPSB4ZW5fbWNfZXh0ZW5kX2FyZ3MoX19IWVBFUlZJU09SX21tdWV4dF9v cCwgc2l6ZW9mKCp1KSk7CisKKwlpZiAobWNzLm1jICE9IE5VTEwpIHsKKwkJbWNzLm1jLT5hcmdz WzFdKys7CisJfSBlbHNlIHsKKwkJbWNzID0gX194ZW5fbWNfZW50cnkoc2l6ZW9mKCp1KSk7CisJ CU1VTFRJX21tdWV4dF9vcChtY3MubWMsIG1jcy5hcmdzLCAxLCBOVUxMLCBET01JRF9TRUxGKTsK Kwl9CisKKwl1ID0gbWNzLmFyZ3M7CisJKnUgPSAqb3A7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9z ZXRfcG1kX2h5cGVyKHBtZF90ICpwdHIsIHBtZF90IHZhbCkKK3sKKwlzdHJ1Y3QgbW11X3VwZGF0 ZSB1OworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwl4ZW5fbWNfYmF0Y2goKTsKKworCS8qIHB0 ciBtYXkgYmUgaW9yZW1hcHBlZCBmb3IgNjQtYml0IHBhZ2V0YWJsZSBzZXR1cCAqLworCXUucHRy ID0gYXJiaXRyYXJ5X3ZpcnRfdG9fbWFjaGluZShwdHIpLm1hZGRyOworCXUudmFsID0gcG1kX3Zh bF9tYSh2YWwpOworCXhlbl9leHRlbmRfbW11X3VwZGF0ZSgmdSk7CisKKwl4ZW5fbWNfaXNzdWUo UEFSQVZJUlRfTEFaWV9NTVUpOworCisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworc3RhdGljIHZv aWQgeGVuX3NldF9wbWQocG1kX3QgKnB0ciwgcG1kX3QgdmFsKQoreworCXRyYWNlX3hlbl9tbXVf c2V0X3BtZChwdHIsIHZhbCk7CisKKwkvKiBJZiBwYWdlIGlzIG5vdCBwaW5uZWQsIHdlIGNhbiBq dXN0IHVwZGF0ZSB0aGUgZW50cnkKKwkgICBkaXJlY3RseSAqLworCWlmICgheGVuX3BhZ2VfcGlu bmVkKHB0cikpIHsKKwkJKnB0ciA9IHZhbDsKKwkJcmV0dXJuOworCX0KKworCXhlbl9zZXRfcG1k X2h5cGVyKHB0ciwgdmFsKTsKK30KKworLyoKKyAqIEFzc29jaWF0ZSBhIHZpcnR1YWwgcGFnZSBm cmFtZSB3aXRoIGEgZ2l2ZW4gcGh5c2ljYWwgcGFnZSBmcmFtZQorICogYW5kIHByb3RlY3Rpb24g ZmxhZ3MgZm9yIHRoYXQgZnJhbWUuCisgKi8KK3ZvaWQgc2V0X3B0ZV9tZm4odW5zaWduZWQgbG9u ZyB2YWRkciwgdW5zaWduZWQgbG9uZyBtZm4sIHBncHJvdF90IGZsYWdzKQoreworCXNldF9wdGVf dmFkZHIodmFkZHIsIG1mbl9wdGUobWZuLCBmbGFncykpOworfQorCitzdGF0aWMgYm9vbCB4ZW5f YmF0Y2hlZF9zZXRfcHRlKHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpCit7CisJc3RydWN0IG1t dV91cGRhdGUgdTsKKworCWlmIChwYXJhdmlydF9nZXRfbGF6eV9tb2RlKCkgIT0gUEFSQVZJUlRf TEFaWV9NTVUpCisJCXJldHVybiBmYWxzZTsKKworCXhlbl9tY19iYXRjaCgpOworCisJdS5wdHIg PSB2aXJ0X3RvX21hY2hpbmUocHRlcCkubWFkZHIgfCBNTVVfTk9STUFMX1BUX1VQREFURTsKKwl1 LnZhbCA9IHB0ZV92YWxfbWEocHRldmFsKTsKKwl4ZW5fZXh0ZW5kX21tdV91cGRhdGUoJnUpOwor CisJeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfTU1VKTsKKworCXJldHVybiB0cnVlOworfQor CitzdGF0aWMgaW5saW5lIHZvaWQgX194ZW5fc2V0X3B0ZShwdGVfdCAqcHRlcCwgcHRlX3QgcHRl dmFsKQoreworCWlmICgheGVuX2JhdGNoZWRfc2V0X3B0ZShwdGVwLCBwdGV2YWwpKSB7CisJCS8q CisJCSAqIENvdWxkIGNhbGwgbmF0aXZlX3NldF9wdGUoKSBoZXJlIGFuZCB0cmFwIGFuZAorCQkg KiBlbXVsYXRlIHRoZSBQVEUgd3JpdGUgYnV0IHdpdGggMzItYml0IGd1ZXN0cyB0aGlzCisJCSAq IG5lZWRzIHR3byB0cmFwcyAob25lIGZvciBlYWNoIG9mIHRoZSB0d28gMzItYml0CisJCSAqIHdv cmRzIGluIHRoZSBQVEUpIHNvIGRvIG9uZSBoeXBlcmNhbGwgZGlyZWN0bHkKKwkJICogaW5zdGVh ZC4KKwkJICovCisJCXN0cnVjdCBtbXVfdXBkYXRlIHU7CisKKwkJdS5wdHIgPSB2aXJ0X3RvX21h Y2hpbmUocHRlcCkubWFkZHIgfCBNTVVfTk9STUFMX1BUX1VQREFURTsKKwkJdS52YWwgPSBwdGVf dmFsX21hKHB0ZXZhbCk7CisJCUhZUEVSVklTT1JfbW11X3VwZGF0ZSgmdSwgMSwgTlVMTCwgRE9N SURfU0VMRik7CisJfQorfQorCitzdGF0aWMgdm9pZCB4ZW5fc2V0X3B0ZShwdGVfdCAqcHRlcCwg cHRlX3QgcHRldmFsKQoreworCXRyYWNlX3hlbl9tbXVfc2V0X3B0ZShwdGVwLCBwdGV2YWwpOwor CV9feGVuX3NldF9wdGUocHRlcCwgcHRldmFsKTsKK30KKworc3RhdGljIHZvaWQgeGVuX3NldF9w dGVfYXQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJICAgIHB0 ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpCit7CisJdHJhY2VfeGVuX21tdV9zZXRfcHRlX2F0KG1t LCBhZGRyLCBwdGVwLCBwdGV2YWwpOworCV9feGVuX3NldF9wdGUocHRlcCwgcHRldmFsKTsKK30K KworcHRlX3QgeGVuX3B0ZXBfbW9kaWZ5X3Byb3Rfc3RhcnQoc3RydWN0IG1tX3N0cnVjdCAqbW0s CisJCQkJIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCit7CisJLyogSnVzdCByZXR1 cm4gdGhlIHB0ZSBhcy1pcy4gIFdlIHByZXNlcnZlIHRoZSBiaXRzIG9uIGNvbW1pdCAqLworCXRy YWNlX3hlbl9tbXVfcHRlcF9tb2RpZnlfcHJvdF9zdGFydChtbSwgYWRkciwgcHRlcCwgKnB0ZXAp OworCXJldHVybiAqcHRlcDsKK30KKwordm9pZCB4ZW5fcHRlcF9tb2RpZnlfcHJvdF9jb21taXQo c3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkgcHRlX3QgKnB0 ZXAsIHB0ZV90IHB0ZSkKK3sKKwlzdHJ1Y3QgbW11X3VwZGF0ZSB1OworCisJdHJhY2VfeGVuX21t dV9wdGVwX21vZGlmeV9wcm90X2NvbW1pdChtbSwgYWRkciwgcHRlcCwgcHRlKTsKKwl4ZW5fbWNf YmF0Y2goKTsKKworCXUucHRyID0gdmlydF90b19tYWNoaW5lKHB0ZXApLm1hZGRyIHwgTU1VX1BU X1VQREFURV9QUkVTRVJWRV9BRDsKKwl1LnZhbCA9IHB0ZV92YWxfbWEocHRlKTsKKwl4ZW5fZXh0 ZW5kX21tdV91cGRhdGUoJnUpOworCisJeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfTU1VKTsK K30KKworLyogQXNzdW1lIHB0ZXZhbF90IGlzIGVxdWl2YWxlbnQgdG8gYWxsIHRoZSBvdGhlciAq dmFsX3QgdHlwZXMuICovCitzdGF0aWMgcHRldmFsX3QgcHRlX21mbl90b19wZm4ocHRldmFsX3Qg dmFsKQoreworCWlmICh2YWwgJiBfUEFHRV9QUkVTRU5UKSB7CisJCXVuc2lnbmVkIGxvbmcgbWZu ID0gKHZhbCAmIFBURV9QRk5fTUFTSykgPj4gUEFHRV9TSElGVDsKKwkJdW5zaWduZWQgbG9uZyBw Zm4gPSBtZm5fdG9fcGZuKG1mbik7CisKKwkJcHRldmFsX3QgZmxhZ3MgPSB2YWwgJiBQVEVfRkxB R1NfTUFTSzsKKwkJaWYgKHVubGlrZWx5KHBmbiA9PSB+MCkpCisJCQl2YWwgPSBmbGFncyAmIH5f UEFHRV9QUkVTRU5UOworCQllbHNlCisJCQl2YWwgPSAoKHB0ZXZhbF90KXBmbiA8PCBQQUdFX1NI SUZUKSB8IGZsYWdzOworCX0KKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBwdGV2YWxfdCBw dGVfcGZuX3RvX21mbihwdGV2YWxfdCB2YWwpCit7CisJaWYgKHZhbCAmIF9QQUdFX1BSRVNFTlQp IHsKKwkJdW5zaWduZWQgbG9uZyBwZm4gPSAodmFsICYgUFRFX1BGTl9NQVNLKSA+PiBQQUdFX1NI SUZUOworCQlwdGV2YWxfdCBmbGFncyA9IHZhbCAmIFBURV9GTEFHU19NQVNLOworCQl1bnNpZ25l ZCBsb25nIG1mbjsKKworCQlpZiAoIXhlbl9mZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVk X3BoeXNtYXApKQorCQkJbWZuID0gX19wZm5fdG9fbWZuKHBmbik7CisJCWVsc2UKKwkJCW1mbiA9 IHBmbjsKKwkJLyoKKwkJICogSWYgdGhlcmUncyBubyBtZm4gZm9yIHRoZSBwZm4sIHRoZW4ganVz dCBjcmVhdGUgYW4KKwkJICogZW1wdHkgbm9uLXByZXNlbnQgcHRlLiAgVW5mb3J0dW5hdGVseSB0 aGlzIGxvc2VzCisJCSAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBwZm4sIHNvCisJ CSAqIHB0ZV9tZm5fdG9fcGZuIGlzIGFzeW1tZXRyaWMuCisJCSAqLworCQlpZiAodW5saWtlbHko bWZuID09IElOVkFMSURfUDJNX0VOVFJZKSkgeworCQkJbWZuID0gMDsKKwkJCWZsYWdzID0gMDsK KwkJfSBlbHNlCisJCQltZm4gJj0gfihGT1JFSUdOX0ZSQU1FX0JJVCB8IElERU5USVRZX0ZSQU1F X0JJVCk7CisJCXZhbCA9ICgocHRldmFsX3QpbWZuIDw8IFBBR0VfU0hJRlQpIHwgZmxhZ3M7CisJ fQorCisJcmV0dXJuIHZhbDsKK30KKworX192aXNpYmxlIHB0ZXZhbF90IHhlbl9wdGVfdmFsKHB0 ZV90IHB0ZSkKK3sKKwlwdGV2YWxfdCBwdGV2YWwgPSBwdGUucHRlOworCisJcmV0dXJuIHB0ZV9t Zm5fdG9fcGZuKHB0ZXZhbCk7Cit9CitQVl9DQUxMRUVfU0FWRV9SRUdTX1RIVU5LKHhlbl9wdGVf dmFsKTsKKworX192aXNpYmxlIHBnZHZhbF90IHhlbl9wZ2RfdmFsKHBnZF90IHBnZCkKK3sKKwly ZXR1cm4gcHRlX21mbl90b19wZm4ocGdkLnBnZCk7Cit9CitQVl9DQUxMRUVfU0FWRV9SRUdTX1RI VU5LKHhlbl9wZ2RfdmFsKTsKKworX192aXNpYmxlIHB0ZV90IHhlbl9tYWtlX3B0ZShwdGV2YWxf dCBwdGUpCit7CisJcHRlID0gcHRlX3Bmbl90b19tZm4ocHRlKTsKKworCXJldHVybiBuYXRpdmVf bWFrZV9wdGUocHRlKTsKK30KK1BWX0NBTExFRV9TQVZFX1JFR1NfVEhVTksoeGVuX21ha2VfcHRl KTsKKworX192aXNpYmxlIHBnZF90IHhlbl9tYWtlX3BnZChwZ2R2YWxfdCBwZ2QpCit7CisJcGdk ID0gcHRlX3Bmbl90b19tZm4ocGdkKTsKKwlyZXR1cm4gbmF0aXZlX21ha2VfcGdkKHBnZCk7Cit9 CitQVl9DQUxMRUVfU0FWRV9SRUdTX1RIVU5LKHhlbl9tYWtlX3BnZCk7CisKK19fdmlzaWJsZSBw bWR2YWxfdCB4ZW5fcG1kX3ZhbChwbWRfdCBwbWQpCit7CisJcmV0dXJuIHB0ZV9tZm5fdG9fcGZu KHBtZC5wbWQpOworfQorUFZfQ0FMTEVFX1NBVkVfUkVHU19USFVOSyh4ZW5fcG1kX3ZhbCk7CisK K3N0YXRpYyB2b2lkIHhlbl9zZXRfcHVkX2h5cGVyKHB1ZF90ICpwdHIsIHB1ZF90IHZhbCkKK3sK KwlzdHJ1Y3QgbW11X3VwZGF0ZSB1OworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwl4ZW5fbWNf YmF0Y2goKTsKKworCS8qIHB0ciBtYXkgYmUgaW9yZW1hcHBlZCBmb3IgNjQtYml0IHBhZ2V0YWJs ZSBzZXR1cCAqLworCXUucHRyID0gYXJiaXRyYXJ5X3ZpcnRfdG9fbWFjaGluZShwdHIpLm1hZGRy OworCXUudmFsID0gcHVkX3ZhbF9tYSh2YWwpOworCXhlbl9leHRlbmRfbW11X3VwZGF0ZSgmdSk7 CisKKwl4ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9NTVUpOworCisJcHJlZW1wdF9lbmFibGUo KTsKK30KKworc3RhdGljIHZvaWQgeGVuX3NldF9wdWQocHVkX3QgKnB0ciwgcHVkX3QgdmFsKQor eworCXRyYWNlX3hlbl9tbXVfc2V0X3B1ZChwdHIsIHZhbCk7CisKKwkvKiBJZiBwYWdlIGlzIG5v dCBwaW5uZWQsIHdlIGNhbiBqdXN0IHVwZGF0ZSB0aGUgZW50cnkKKwkgICBkaXJlY3RseSAqLwor CWlmICgheGVuX3BhZ2VfcGlubmVkKHB0cikpIHsKKwkJKnB0ciA9IHZhbDsKKwkJcmV0dXJuOwor CX0KKworCXhlbl9zZXRfcHVkX2h5cGVyKHB0ciwgdmFsKTsKK30KKworI2lmZGVmIENPTkZJR19Y ODZfUEFFCitzdGF0aWMgdm9pZCB4ZW5fc2V0X3B0ZV9hdG9taWMocHRlX3QgKnB0ZXAsIHB0ZV90 IHB0ZSkKK3sKKwl0cmFjZV94ZW5fbW11X3NldF9wdGVfYXRvbWljKHB0ZXAsIHB0ZSk7CisJc2V0 XzY0Yml0KCh1NjQgKilwdGVwLCBuYXRpdmVfcHRlX3ZhbChwdGUpKTsKK30KKworc3RhdGljIHZv aWQgeGVuX3B0ZV9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRy LCBwdGVfdCAqcHRlcCkKK3sKKwl0cmFjZV94ZW5fbW11X3B0ZV9jbGVhcihtbSwgYWRkciwgcHRl cCk7CisJaWYgKCF4ZW5fYmF0Y2hlZF9zZXRfcHRlKHB0ZXAsIG5hdGl2ZV9tYWtlX3B0ZSgwKSkp CisJCW5hdGl2ZV9wdGVfY2xlYXIobW0sIGFkZHIsIHB0ZXApOworfQorCitzdGF0aWMgdm9pZCB4 ZW5fcG1kX2NsZWFyKHBtZF90ICpwbWRwKQoreworCXRyYWNlX3hlbl9tbXVfcG1kX2NsZWFyKHBt ZHApOworCXNldF9wbWQocG1kcCwgX19wbWQoMCkpOworfQorI2VuZGlmCS8qIENPTkZJR19YODZf UEFFICovCisKK19fdmlzaWJsZSBwbWRfdCB4ZW5fbWFrZV9wbWQocG1kdmFsX3QgcG1kKQorewor CXBtZCA9IHB0ZV9wZm5fdG9fbWZuKHBtZCk7CisJcmV0dXJuIG5hdGl2ZV9tYWtlX3BtZChwbWQp OworfQorUFZfQ0FMTEVFX1NBVkVfUkVHU19USFVOSyh4ZW5fbWFrZV9wbWQpOworCisjaWYgQ09O RklHX1BHVEFCTEVfTEVWRUxTID09IDQKK19fdmlzaWJsZSBwdWR2YWxfdCB4ZW5fcHVkX3ZhbChw dWRfdCBwdWQpCit7CisJcmV0dXJuIHB0ZV9tZm5fdG9fcGZuKHB1ZC5wdWQpOworfQorUFZfQ0FM TEVFX1NBVkVfUkVHU19USFVOSyh4ZW5fcHVkX3ZhbCk7CisKK19fdmlzaWJsZSBwdWRfdCB4ZW5f bWFrZV9wdWQocHVkdmFsX3QgcHVkKQoreworCXB1ZCA9IHB0ZV9wZm5fdG9fbWZuKHB1ZCk7CisK KwlyZXR1cm4gbmF0aXZlX21ha2VfcHVkKHB1ZCk7Cit9CitQVl9DQUxMRUVfU0FWRV9SRUdTX1RI VU5LKHhlbl9tYWtlX3B1ZCk7CisKK3N0YXRpYyBwZ2RfdCAqeGVuX2dldF91c2VyX3BnZChwZ2Rf dCAqcGdkKQoreworCXBnZF90ICpwZ2RfcGFnZSA9IChwZ2RfdCAqKSgoKHVuc2lnbmVkIGxvbmcp cGdkKSAmIFBBR0VfTUFTSyk7CisJdW5zaWduZWQgb2Zmc2V0ID0gcGdkIC0gcGdkX3BhZ2U7CisJ cGdkX3QgKnVzZXJfcHRyID0gTlVMTDsKKworCWlmIChvZmZzZXQgPCBwZ2RfaW5kZXgoVVNFUl9M SU1JVCkpIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocGdkX3BhZ2UpOwor CQl1c2VyX3B0ciA9IChwZ2RfdCAqKXBhZ2UtPnByaXZhdGU7CisJCWlmICh1c2VyX3B0cikKKwkJ CXVzZXJfcHRyICs9IG9mZnNldDsKKwl9CisKKwlyZXR1cm4gdXNlcl9wdHI7Cit9CisKK3N0YXRp YyB2b2lkIF9feGVuX3NldF9wZ2RfaHlwZXIocGdkX3QgKnB0ciwgcGdkX3QgdmFsKQoreworCXN0 cnVjdCBtbXVfdXBkYXRlIHU7CisKKwl1LnB0ciA9IHZpcnRfdG9fbWFjaGluZShwdHIpLm1hZGRy OworCXUudmFsID0gcGdkX3ZhbF9tYSh2YWwpOworCXhlbl9leHRlbmRfbW11X3VwZGF0ZSgmdSk7 Cit9CisKKy8qCisgKiBSYXcgaHlwZXJjYWxsLWJhc2VkIHNldF9wZ2QsIGludGVuZGVkIGZvciBp biBlYXJseSBib290IGJlZm9yZQorICogdGhlcmUncyBhIHBhZ2Ugc3RydWN0dXJlLiAgVGhpcyBp bXBsaWVzOgorICogIDEuIFRoZSBvbmx5IGV4aXN0aW5nIHBhZ2V0YWJsZSBpcyB0aGUga2VybmVs J3MKKyAqICAyLiBJdCBpcyBhbHdheXMgcGlubmVkCisgKiAgMy4gSXQgaGFzIG5vIHVzZXIgcGFn ZXRhYmxlIGF0dGFjaGVkIHRvIGl0CisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5fc2V0X3Bn ZF9oeXBlcihwZ2RfdCAqcHRyLCBwZ2RfdCB2YWwpCit7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisK Kwl4ZW5fbWNfYmF0Y2goKTsKKworCV9feGVuX3NldF9wZ2RfaHlwZXIocHRyLCB2YWwpOworCisJ eGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfTU1VKTsKKworCXByZWVtcHRfZW5hYmxlKCk7Cit9 CisKK3N0YXRpYyB2b2lkIHhlbl9zZXRfcGdkKHBnZF90ICpwdHIsIHBnZF90IHZhbCkKK3sKKwlw Z2RfdCAqdXNlcl9wdHIgPSB4ZW5fZ2V0X3VzZXJfcGdkKHB0cik7CisKKwl0cmFjZV94ZW5fbW11 X3NldF9wZ2QocHRyLCB1c2VyX3B0ciwgdmFsKTsKKworCS8qIElmIHBhZ2UgaXMgbm90IHBpbm5l ZCwgd2UgY2FuIGp1c3QgdXBkYXRlIHRoZSBlbnRyeQorCSAgIGRpcmVjdGx5ICovCisJaWYgKCF4 ZW5fcGFnZV9waW5uZWQocHRyKSkgeworCQkqcHRyID0gdmFsOworCQlpZiAodXNlcl9wdHIpIHsK KwkJCVdBUk5fT04oeGVuX3BhZ2VfcGlubmVkKHVzZXJfcHRyKSk7CisJCQkqdXNlcl9wdHIgPSB2 YWw7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIElmIGl0J3MgcGlubmVkLCB0aGVuIHdlIGNh biBhdCBsZWFzdCBiYXRjaCB0aGUga2VybmVsIGFuZAorCSAgIHVzZXIgdXBkYXRlcyB0b2dldGhl ci4gKi8KKwl4ZW5fbWNfYmF0Y2goKTsKKworCV9feGVuX3NldF9wZ2RfaHlwZXIocHRyLCB2YWwp OworCWlmICh1c2VyX3B0cikKKwkJX194ZW5fc2V0X3BnZF9oeXBlcih1c2VyX3B0ciwgdmFsKTsK KworCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX01NVSk7Cit9CisjZW5kaWYJLyogQ09ORklH X1BHVEFCTEVfTEVWRUxTID09IDQgKi8KKworLyoKKyAqIChZZXQgYW5vdGhlcikgcGFnZXRhYmxl IHdhbGtlci4gIFRoaXMgb25lIGlzIGludGVuZGVkIGZvciBwaW5uaW5nIGEKKyAqIHBhZ2V0YWJs ZS4gIFRoaXMgbWVhbnMgdGhhdCBpdCB3YWxrcyBhIHBhZ2V0YWJsZSBhbmQgY2FsbHMgdGhlCisg KiBjYWxsYmFjayBmdW5jdGlvbiBvbiBlYWNoIHBhZ2UgaXQgZmluZHMgbWFraW5nIHVwIHRoZSBw YWdlIHRhYmxlLAorICogYXQgZXZlcnkgbGV2ZWwuICBJdCB3YWxrcyB0aGUgZW50aXJlIHBhZ2V0 YWJsZSwgYnV0IGl0IG9ubHkgYm90aGVycworICogcGlubmluZyBwdGUgcGFnZXMgd2hpY2ggYXJl IGJlbG93IGxpbWl0LiAgSW4gdGhlIG5vcm1hbCBjYXNlIHRoaXMKKyAqIHdpbGwgYmUgU1RBQ0tf VE9QX01BWCwgYnV0IGF0IGJvb3Qgd2UgbmVlZCB0byBwaW4gdXAgdG8KKyAqIEZJWEFERFJfVE9Q LgorICoKKyAqIEZvciAzMi1iaXQgdGhlIGltcG9ydGFudCBiaXQgaXMgdGhhdCB3ZSBkb24ndCBw aW4gYmV5b25kIHRoZXJlLAorICogYmVjYXVzZSB0aGVuIHdlIHN0YXJ0IGdldHRpbmcgaW50byBY ZW4ncyBwdGVzLgorICoKKyAqIEZvciA2NC1iaXQsIHdlIG11c3Qgc2tpcCB0aGUgWGVuIGhvbGUg aW4gdGhlIG1pZGRsZSBvZiB0aGUgYWRkcmVzcworICogc3BhY2UsIGp1c3QgYWZ0ZXIgdGhlIGJp ZyB4ODYtNjQgdmlydHVhbCBob2xlLgorICovCitzdGF0aWMgaW50IF9feGVuX3BnZF93YWxrKHN0 cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdkLAorCQkJICBpbnQgKCpmdW5jKShzdHJ1Y3Qg bW1fc3RydWN0ICptbSwgc3RydWN0IHBhZ2UgKiwKKwkJCQkgICAgICBlbnVtIHB0X2xldmVsKSwK KwkJCSAgdW5zaWduZWQgbG9uZyBsaW1pdCkKK3sKKwlpbnQgZmx1c2ggPSAwOworCXVuc2lnbmVk IGhvbGVfbG93LCBob2xlX2hpZ2g7CisJdW5zaWduZWQgcGdkaWR4X2xpbWl0LCBwdWRpZHhfbGlt aXQsIHBtZGlkeF9saW1pdDsKKwl1bnNpZ25lZCBwZ2RpZHgsIHB1ZGlkeCwgcG1kaWR4OworCisJ LyogVGhlIGxpbWl0IGlzIHRoZSBsYXN0IGJ5dGUgdG8gYmUgdG91Y2hlZCAqLworCWxpbWl0LS07 CisJQlVHX09OKGxpbWl0ID49IEZJWEFERFJfVE9QKTsKKworCWlmICh4ZW5fZmVhdHVyZShYRU5G RUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIDY0 LWJpdCBoYXMgYSBncmVhdCBiaWcgaG9sZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBhZGRyZXNzCisJ ICogc3BhY2UsIHdoaWNoIGNvbnRhaW5zIHRoZSBYZW4gbWFwcGluZ3MuICBPbiAzMi1iaXQgdGhl c2UKKwkgKiB3aWxsIGVuZCB1cCBtYWtpbmcgYSB6ZXJvLXNpemVkIGhvbGUgYW5kIHNvIGlzIGEg bm8tb3AuCisJICovCisJaG9sZV9sb3cgPSBwZ2RfaW5kZXgoVVNFUl9MSU1JVCk7CisJaG9sZV9o aWdoID0gcGdkX2luZGV4KFBBR0VfT0ZGU0VUKTsKKworCXBnZGlkeF9saW1pdCA9IHBnZF9pbmRl eChsaW1pdCk7CisjaWYgUFRSU19QRVJfUFVEID4gMQorCXB1ZGlkeF9saW1pdCA9IHB1ZF9pbmRl eChsaW1pdCk7CisjZWxzZQorCXB1ZGlkeF9saW1pdCA9IDA7CisjZW5kaWYKKyNpZiBQVFJTX1BF Ul9QTUQgPiAxCisJcG1kaWR4X2xpbWl0ID0gcG1kX2luZGV4KGxpbWl0KTsKKyNlbHNlCisJcG1k aWR4X2xpbWl0ID0gMDsKKyNlbmRpZgorCisJZm9yIChwZ2RpZHggPSAwOyBwZ2RpZHggPD0gcGdk aWR4X2xpbWl0OyBwZ2RpZHgrKykgeworCQlwdWRfdCAqcHVkOworCisJCWlmIChwZ2RpZHggPj0g aG9sZV9sb3cgJiYgcGdkaWR4IDwgaG9sZV9oaWdoKQorCQkJY29udGludWU7CisKKwkJaWYgKCFw Z2RfdmFsKHBnZFtwZ2RpZHhdKSkKKwkJCWNvbnRpbnVlOworCisJCXB1ZCA9IHB1ZF9vZmZzZXQo JnBnZFtwZ2RpZHhdLCAwKTsKKworCQlpZiAoUFRSU19QRVJfUFVEID4gMSkgLyogbm90IGZvbGRl ZCAqLworCQkJZmx1c2ggfD0gKCpmdW5jKShtbSwgdmlydF90b19wYWdlKHB1ZCksIFBUX1BVRCk7 CisKKwkJZm9yIChwdWRpZHggPSAwOyBwdWRpZHggPCBQVFJTX1BFUl9QVUQ7IHB1ZGlkeCsrKSB7 CisJCQlwbWRfdCAqcG1kOworCisJCQlpZiAocGdkaWR4ID09IHBnZGlkeF9saW1pdCAmJgorCQkJ ICAgIHB1ZGlkeCA+IHB1ZGlkeF9saW1pdCkKKwkJCQlnb3RvIG91dDsKKworCQkJaWYgKHB1ZF9u b25lKHB1ZFtwdWRpZHhdKSkKKwkJCQljb250aW51ZTsKKworCQkJcG1kID0gcG1kX29mZnNldCgm cHVkW3B1ZGlkeF0sIDApOworCisJCQlpZiAoUFRSU19QRVJfUE1EID4gMSkgLyogbm90IGZvbGRl ZCAqLworCQkJCWZsdXNoIHw9ICgqZnVuYykobW0sIHZpcnRfdG9fcGFnZShwbWQpLCBQVF9QTUQp OworCisJCQlmb3IgKHBtZGlkeCA9IDA7IHBtZGlkeCA8IFBUUlNfUEVSX1BNRDsgcG1kaWR4Kysp IHsKKwkJCQlzdHJ1Y3QgcGFnZSAqcHRlOworCisJCQkJaWYgKHBnZGlkeCA9PSBwZ2RpZHhfbGlt aXQgJiYKKwkJCQkgICAgcHVkaWR4ID09IHB1ZGlkeF9saW1pdCAmJgorCQkJCSAgICBwbWRpZHgg PiBwbWRpZHhfbGltaXQpCisJCQkJCWdvdG8gb3V0OworCisJCQkJaWYgKHBtZF9ub25lKHBtZFtw bWRpZHhdKSkKKwkJCQkJY29udGludWU7CisKKwkJCQlwdGUgPSBwbWRfcGFnZShwbWRbcG1kaWR4 XSk7CisJCQkJZmx1c2ggfD0gKCpmdW5jKShtbSwgcHRlLCBQVF9QVEUpOworCQkJfQorCQl9CisJ fQorCitvdXQ6CisJLyogRG8gdGhlIHRvcCBsZXZlbCBsYXN0LCBzbyB0aGF0IHRoZSBjYWxsYmFj a3MgY2FuIHVzZSBpdCBhcworCSAgIGEgY3VlIHRvIGRvIGZpbmFsIHRoaW5ncyBsaWtlIHRsYiBm bHVzaGVzLiAqLworCWZsdXNoIHw9ICgqZnVuYykobW0sIHZpcnRfdG9fcGFnZShwZ2QpLCBQVF9Q R0QpOworCisJcmV0dXJuIGZsdXNoOworfQorCitzdGF0aWMgaW50IHhlbl9wZ2Rfd2FsayhzdHJ1 Y3QgbW1fc3RydWN0ICptbSwKKwkJCWludCAoKmZ1bmMpKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBz dHJ1Y3QgcGFnZSAqLAorCQkJCSAgICBlbnVtIHB0X2xldmVsKSwKKwkJCXVuc2lnbmVkIGxvbmcg bGltaXQpCit7CisJcmV0dXJuIF9feGVuX3BnZF93YWxrKG1tLCBtbS0+cGdkLCBmdW5jLCBsaW1p dCk7Cit9CisKKy8qIElmIHdlJ3JlIHVzaW5nIHNwbGl0IHB0ZSBsb2NrcywgdGhlbiB0YWtlIHRo ZSBwYWdlJ3MgbG9jayBhbmQKKyAgIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuICBPdGhlcndpc2Ug cmV0dXJuIE5VTEwuICovCitzdGF0aWMgc3BpbmxvY2tfdCAqeGVuX3B0ZV9sb2NrKHN0cnVjdCBw YWdlICpwYWdlLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlzcGlubG9ja190ICpwdGwgPSBO VUxMOworCisjaWYgVVNFX1NQTElUX1BURV9QVExPQ0tTCisJcHRsID0gcHRsb2NrX3B0cihwYWdl KTsKKwlzcGluX2xvY2tfbmVzdF9sb2NrKHB0bCwgJm1tLT5wYWdlX3RhYmxlX2xvY2spOworI2Vu ZGlmCisKKwlyZXR1cm4gcHRsOworfQorCitzdGF0aWMgdm9pZCB4ZW5fcHRlX3VubG9jayh2b2lk ICp2KQoreworCXNwaW5sb2NrX3QgKnB0bCA9IHY7CisJc3Bpbl91bmxvY2socHRsKTsKK30KKwor c3RhdGljIHZvaWQgeGVuX2RvX3Bpbih1bnNpZ25lZCBsZXZlbCwgdW5zaWduZWQgbG9uZyBwZm4p Cit7CisJc3RydWN0IG1tdWV4dF9vcCBvcDsKKworCW9wLmNtZCA9IGxldmVsOworCW9wLmFyZzEu bWZuID0gcGZuX3RvX21mbihwZm4pOworCisJeGVuX2V4dGVuZF9tbXVleHRfb3AoJm9wKTsKK30K Kworc3RhdGljIGludCB4ZW5fcGluX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBw YWdlICpwYWdlLAorCQkJZW51bSBwdF9sZXZlbCBsZXZlbCkKK3sKKwl1bnNpZ25lZCBwZ2ZsID0g VGVzdFNldFBhZ2VQaW5uZWQocGFnZSk7CisJaW50IGZsdXNoOworCisJaWYgKHBnZmwpCisJCWZs dXNoID0gMDsJCS8qIGFscmVhZHkgcGlubmVkICovCisJZWxzZSBpZiAoUGFnZUhpZ2hNZW0ocGFn ZSkpCisJCS8qIGttYXBzIG5lZWQgZmx1c2hpbmcgaWYgd2UgZm91bmQgYW4gdW5waW5uZWQKKwkJ ICAgaGlnaHBhZ2UgKi8KKwkJZmx1c2ggPSAxOworCWVsc2UgeworCQl2b2lkICpwdCA9IGxvd21l bV9wYWdlX2FkZHJlc3MocGFnZSk7CisJCXVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZV90b19wZm4o cGFnZSk7CisJCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzID0gX194ZW5fbWNfZW50cnkoMCk7 CisJCXNwaW5sb2NrX3QgKnB0bDsKKworCQlmbHVzaCA9IDA7CisKKwkJLyoKKwkJICogV2UgbmVl ZCB0byBob2xkIHRoZSBwYWdldGFibGUgbG9jayBiZXR3ZWVuIHRoZSB0aW1lCisJCSAqIHdlIG1h a2UgdGhlIHBhZ2V0YWJsZSBSTyBhbmQgd2hlbiB3ZSBhY3R1YWxseSBwaW4KKwkJICogaXQuICBJ ZiB3ZSBkb24ndCwgdGhlbiBvdGhlciB1c2VycyBtYXkgY29tZSBpbiBhbmQKKwkJICogYXR0ZW1w dCB0byB1cGRhdGUgdGhlIHBhZ2V0YWJsZSBieSB3cml0aW5nIGl0LAorCQkgKiB3aGljaCB3aWxs IGZhaWwgYmVjYXVzZSB0aGUgbWVtb3J5IGlzIFJPIGJ1dCBub3QKKwkJICogcGlubmVkLCBzbyBY ZW4gd29uJ3QgZG8gdGhlIHRyYXAnbidlbXVsYXRlLgorCQkgKgorCQkgKiBJZiB3ZSdyZSB1c2lu ZyBzcGxpdCBwdGUgbG9ja3MsIHdlIGNhbid0IGhvbGQgdGhlCisJCSAqIGVudGlyZSBwYWdldGFi bGUncyB3b3J0aCBvZiBsb2NrcyBkdXJpbmcgdGhlCisJCSAqIHRyYXZlcnNlLCBiZWNhdXNlIHdl IG1heSB3cmFwIHRoZSBwcmVlbXB0IGNvdW50ICg4CisJCSAqIGJpdHMpLiAgVGhlIHNvbHV0aW9u IGlzIHRvIG1hcmsgUk8gYW5kIHBpbiBlYWNoIFBURQorCQkgKiBwYWdlIHdoaWxlIGhvbGRpbmcg dGhlIGxvY2suICBUaGlzIG1lYW5zIHRoZSBudW1iZXIKKwkJICogb2YgbG9ja3Mgd2UgZW5kIHVw IGhvbGRpbmcgaXMgbmV2ZXIgbW9yZSB0aGFuIGEKKwkJICogYmF0Y2ggc2l6ZSAofjMyIGVudHJp ZXMsIGF0IHByZXNlbnQpLgorCQkgKgorCQkgKiBJZiB3ZSdyZSBub3QgdXNpbmcgc3BsaXQgcHRl IGxvY2tzLCB3ZSBuZWVkbid0IHBpbgorCQkgKiB0aGUgUFRFIHBhZ2VzIGluZGVwZW5kZW50bHks IGJlY2F1c2Ugd2UncmUKKwkJICogcHJvdGVjdGVkIGJ5IHRoZSBvdmVyYWxsIHBhZ2V0YWJsZSBs b2NrLgorCQkgKi8KKwkJcHRsID0gTlVMTDsKKwkJaWYgKGxldmVsID09IFBUX1BURSkKKwkJCXB0 bCA9IHhlbl9wdGVfbG9jayhwYWdlLCBtbSk7CisKKwkJTVVMVElfdXBkYXRlX3ZhX21hcHBpbmco bWNzLm1jLCAodW5zaWduZWQgbG9uZylwdCwKKwkJCQkJcGZuX3B0ZShwZm4sIFBBR0VfS0VSTkVM X1JPKSwKKwkJCQkJbGV2ZWwgPT0gUFRfUEdEID8gVVZNRl9UTEJfRkxVU0ggOiAwKTsKKworCQlp ZiAocHRsKSB7CisJCQl4ZW5fZG9fcGluKE1NVUVYVF9QSU5fTDFfVEFCTEUsIHBmbik7CisKKwkJ CS8qIFF1ZXVlIGEgZGVmZXJyZWQgdW5sb2NrIGZvciB3aGVuIHRoaXMgYmF0Y2gKKwkJCSAgIGlz IGNvbXBsZXRlZC4gKi8KKwkJCXhlbl9tY19jYWxsYmFjayh4ZW5fcHRlX3VubG9jaywgcHRsKTsK KwkJfQorCX0KKworCXJldHVybiBmbHVzaDsKK30KKworLyogVGhpcyBpcyBjYWxsZWQganVzdCBh ZnRlciBhIG1tIGhhcyBiZWVuIGNyZWF0ZWQsIGJ1dCBpdCBoYXMgbm90CisgICBiZWVuIHVzZWQg eWV0LiAgV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBpdHMgcGFnZXRhYmxlIGlzIGFsbAorICAg cmVhZC1vbmx5LCBhbmQgY2FuIGJlIHBpbm5lZC4gKi8KK3N0YXRpYyB2b2lkIF9feGVuX3BnZF9w aW4oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QpCit7CisJdHJhY2VfeGVuX21tdV9w Z2RfcGluKG1tLCBwZ2QpOworCisJeGVuX21jX2JhdGNoKCk7CisKKwlpZiAoX194ZW5fcGdkX3dh bGsobW0sIHBnZCwgeGVuX3Bpbl9wYWdlLCBVU0VSX0xJTUlUKSkgeworCQkvKiByZS1lbmFibGUg aW50ZXJydXB0cyBmb3IgZmx1c2hpbmcgKi8KKwkJeGVuX21jX2lzc3VlKDApOworCisJCWttYXBf Zmx1c2hfdW51c2VkKCk7CisKKwkJeGVuX21jX2JhdGNoKCk7CisJfQorCisjaWZkZWYgQ09ORklH X1g4Nl82NAorCXsKKwkJcGdkX3QgKnVzZXJfcGdkID0geGVuX2dldF91c2VyX3BnZChwZ2QpOwor CisJCXhlbl9kb19waW4oTU1VRVhUX1BJTl9MNF9UQUJMRSwgUEZOX0RPV04oX19wYShwZ2QpKSk7 CisKKwkJaWYgKHVzZXJfcGdkKSB7CisJCQl4ZW5fcGluX3BhZ2UobW0sIHZpcnRfdG9fcGFnZSh1 c2VyX3BnZCksIFBUX1BHRCk7CisJCQl4ZW5fZG9fcGluKE1NVUVYVF9QSU5fTDRfVEFCTEUsCisJ CQkJICAgUEZOX0RPV04oX19wYSh1c2VyX3BnZCkpKTsKKwkJfQorCX0KKyNlbHNlIC8qIENPTkZJ R19YODZfMzIgKi8KKyNpZmRlZiBDT05GSUdfWDg2X1BBRQorCS8qIE5lZWQgdG8gbWFrZSBzdXJl IHVuc2hhcmVkIGtlcm5lbCBQTUQgaXMgcGlubmFibGUgKi8KKwl4ZW5fcGluX3BhZ2UobW0sIHBn ZF9wYWdlKHBnZFtwZ2RfaW5kZXgoVEFTS19TSVpFKV0pLAorCQkgICAgIFBUX1BNRCk7CisjZW5k aWYKKwl4ZW5fZG9fcGluKE1NVUVYVF9QSU5fTDNfVEFCTEUsIFBGTl9ET1dOKF9fcGEocGdkKSkp OworI2VuZGlmIC8qIENPTkZJR19YODZfNjQgKi8KKwl4ZW5fbWNfaXNzdWUoMCk7Cit9CisKK3N0 YXRpYyB2b2lkIHhlbl9wZ2RfcGluKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCV9feGVuX3Bn ZF9waW4obW0sIG1tLT5wZ2QpOworfQorCisvKgorICogT24gc2F2ZSwgd2UgbmVlZCB0byBwaW4g YWxsIHBhZ2V0YWJsZXMgdG8gbWFrZSBzdXJlIHRoZXkgZ2V0IHRoZWlyCisgKiBtZm5zIHR1cm5l ZCBpbnRvIHBmbnMuICBTZWFyY2ggdGhlIGxpc3QgZm9yIGFueSB1bnBpbm5lZCBwZ2RzIGFuZCBw aW4KKyAqIHRoZW0gKHVucGlubmVkIHBnZHMgYXJlIG5vdCBjdXJyZW50bHkgaW4gdXNlLCBwcm9i YWJseSBiZWNhdXNlIHRoZQorICogcHJvY2VzcyBpcyB1bmRlciBjb25zdHJ1Y3Rpb24gb3IgZGVz dHJ1Y3Rpb24pLgorICoKKyAqIEV4cGVjdGVkIHRvIGJlIGNhbGxlZCBpbiBzdG9wX21hY2hpbmUo KSAoImVxdWl2YWxlbnQgdG8gdGFraW5nCisgKiBldmVyeSBzcGlubG9jayBpbiB0aGUgc3lzdGVt IiksIHNvIHRoZSBsb2NraW5nIGRvZXNuJ3QgcmVhbGx5CisgKiBtYXR0ZXIgYWxsIHRoYXQgbXVj aC4KKyAqLwordm9pZCB4ZW5fbW1fcGluX2FsbCh2b2lkKQoreworCXN0cnVjdCBwYWdlICpwYWdl OworCisJc3Bpbl9sb2NrKCZwZ2RfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhZ2Us ICZwZ2RfbGlzdCwgbHJ1KSB7CisJCWlmICghUGFnZVBpbm5lZChwYWdlKSkgeworCQkJX194ZW5f cGdkX3BpbigmaW5pdF9tbSwgKHBnZF90ICopcGFnZV9hZGRyZXNzKHBhZ2UpKTsKKwkJCVNldFBh Z2VTYXZlUGlubmVkKHBhZ2UpOworCQl9CisJfQorCisJc3Bpbl91bmxvY2soJnBnZF9sb2NrKTsK K30KKworLyoKKyAqIFRoZSBpbml0X21tIHBhZ2V0YWJsZSBpcyByZWFsbHkgcGlubmVkIGFzIHNv b24gYXMgaXRzIGNyZWF0ZWQsIGJ1dAorICogdGhhdCdzIGJlZm9yZSB3ZSBoYXZlIHBhZ2Ugc3Ry dWN0dXJlcyB0byBzdG9yZSB0aGUgYml0cy4gIFNvIGRvIGFsbAorICogdGhlIGJvb2sta2VlcGlu ZyBub3cuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHhlbl9tYXJrX3Bpbm5lZChzdHJ1Y3QgbW1f c3RydWN0ICptbSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICBlbnVtIHB0X2xldmVsIGxldmVs KQoreworCVNldFBhZ2VQaW5uZWQocGFnZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lk IF9faW5pdCB4ZW5fbWFya19pbml0X21tX3Bpbm5lZCh2b2lkKQoreworCXhlbl9wZ2Rfd2Fsaygm aW5pdF9tbSwgeGVuX21hcmtfcGlubmVkLCBGSVhBRERSX1RPUCk7Cit9CisKK3N0YXRpYyBpbnQg eGVuX3VucGluX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBwYWdlICpwYWdlLAor CQkJICBlbnVtIHB0X2xldmVsIGxldmVsKQoreworCXVuc2lnbmVkIHBnZmwgPSBUZXN0Q2xlYXJQ YWdlUGlubmVkKHBhZ2UpOworCisJaWYgKHBnZmwgJiYgIVBhZ2VIaWdoTWVtKHBhZ2UpKSB7CisJ CXZvaWQgKnB0ID0gbG93bWVtX3BhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJdW5zaWduZWQgbG9uZyBw Zm4gPSBwYWdlX3RvX3BmbihwYWdlKTsKKwkJc3BpbmxvY2tfdCAqcHRsID0gTlVMTDsKKwkJc3Ry dWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7CisKKwkJLyoKKwkJICogRG8gdGhlIGNvbnZlcnNlIHRv IHBpbl9wYWdlLiAgSWYgd2UncmUgdXNpbmcgc3BsaXQKKwkJICogcHRlIGxvY2tzLCB3ZSBtdXN0 IGJlIGhvbGRpbmcgdGhlIGxvY2sgZm9yIHdoaWxlCisJCSAqIHRoZSBwdGUgcGFnZSBpcyB1bnBp bm5lZCBidXQgc3RpbGwgUk8gdG8gcHJldmVudAorCQkgKiBjb25jdXJyZW50IHVwZGF0ZXMgZnJv bSBzZWVpbmcgaXQgaW4gdGhpcworCQkgKiBwYXJ0aWFsbHktcGlubmVkIHN0YXRlLgorCQkgKi8K KwkJaWYgKGxldmVsID09IFBUX1BURSkgeworCQkJcHRsID0geGVuX3B0ZV9sb2NrKHBhZ2UsIG1t KTsKKworCQkJaWYgKHB0bCkKKwkJCQl4ZW5fZG9fcGluKE1NVUVYVF9VTlBJTl9UQUJMRSwgcGZu KTsKKwkJfQorCisJCW1jcyA9IF9feGVuX21jX2VudHJ5KDApOworCisJCU1VTFRJX3VwZGF0ZV92 YV9tYXBwaW5nKG1jcy5tYywgKHVuc2lnbmVkIGxvbmcpcHQsCisJCQkJCXBmbl9wdGUocGZuLCBQ QUdFX0tFUk5FTCksCisJCQkJCWxldmVsID09IFBUX1BHRCA/IFVWTUZfVExCX0ZMVVNIIDogMCk7 CisKKwkJaWYgKHB0bCkgeworCQkJLyogdW5sb2NrIHdoZW4gYmF0Y2ggY29tcGxldGVkICovCisJ CQl4ZW5fbWNfY2FsbGJhY2soeGVuX3B0ZV91bmxvY2ssIHB0bCk7CisJCX0KKwl9CisKKwlyZXR1 cm4gMDsJCS8qIG5ldmVyIG5lZWQgdG8gZmx1c2ggb24gdW5waW4gKi8KK30KKworLyogUmVsZWFz ZSBhIHBhZ2V0YWJsZXMgcGFnZXMgYmFjayBhcyBub3JtYWwgUlcgKi8KK3N0YXRpYyB2b2lkIF9f eGVuX3BnZF91bnBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGdkX3QgKnBnZCkKK3sKKwl0cmFj ZV94ZW5fbW11X3BnZF91bnBpbihtbSwgcGdkKTsKKworCXhlbl9tY19iYXRjaCgpOworCisJeGVu X2RvX3BpbihNTVVFWFRfVU5QSU5fVEFCTEUsIFBGTl9ET1dOKF9fcGEocGdkKSkpOworCisjaWZk ZWYgQ09ORklHX1g4Nl82NAorCXsKKwkJcGdkX3QgKnVzZXJfcGdkID0geGVuX2dldF91c2VyX3Bn ZChwZ2QpOworCisJCWlmICh1c2VyX3BnZCkgeworCQkJeGVuX2RvX3BpbihNTVVFWFRfVU5QSU5f VEFCTEUsCisJCQkJICAgUEZOX0RPV04oX19wYSh1c2VyX3BnZCkpKTsKKwkJCXhlbl91bnBpbl9w YWdlKG1tLCB2aXJ0X3RvX3BhZ2UodXNlcl9wZ2QpLCBQVF9QR0QpOworCQl9CisJfQorI2VuZGlm CisKKyNpZmRlZiBDT05GSUdfWDg2X1BBRQorCS8qIE5lZWQgdG8gbWFrZSBzdXJlIHVuc2hhcmVk IGtlcm5lbCBQTUQgaXMgdW5waW5uZWQgKi8KKwl4ZW5fdW5waW5fcGFnZShtbSwgcGdkX3BhZ2Uo cGdkW3BnZF9pbmRleChUQVNLX1NJWkUpXSksCisJCSAgICAgICBQVF9QTUQpOworI2VuZGlmCisK KwlfX3hlbl9wZ2Rfd2FsayhtbSwgcGdkLCB4ZW5fdW5waW5fcGFnZSwgVVNFUl9MSU1JVCk7CisK Kwl4ZW5fbWNfaXNzdWUoMCk7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9wZ2RfdW5waW4oc3RydWN0 IG1tX3N0cnVjdCAqbW0pCit7CisJX194ZW5fcGdkX3VucGluKG1tLCBtbS0+cGdkKTsKK30KKwor LyoKKyAqIE9uIHJlc3VtZSwgdW5kbyBhbnkgcGlubmluZyBkb25lIGF0IHNhdmUsIHNvIHRoYXQg dGhlIHJlc3Qgb2YgdGhlCisgKiBrZXJuZWwgZG9lc24ndCBzZWUgYW55IHVuZXhwZWN0ZWQgcGlu bmVkIHBhZ2V0YWJsZXMuCisgKi8KK3ZvaWQgeGVuX21tX3VucGluX2FsbCh2b2lkKQoreworCXN0 cnVjdCBwYWdlICpwYWdlOworCisJc3Bpbl9sb2NrKCZwZ2RfbG9jayk7CisKKwlsaXN0X2Zvcl9l YWNoX2VudHJ5KHBhZ2UsICZwZ2RfbGlzdCwgbHJ1KSB7CisJCWlmIChQYWdlU2F2ZVBpbm5lZChw YWdlKSkgeworCQkJQlVHX09OKCFQYWdlUGlubmVkKHBhZ2UpKTsKKwkJCV9feGVuX3BnZF91bnBp bigmaW5pdF9tbSwgKHBnZF90ICopcGFnZV9hZGRyZXNzKHBhZ2UpKTsKKwkJCUNsZWFyUGFnZVNh dmVQaW5uZWQocGFnZSk7CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmcGdkX2xvY2spOworfQor CitzdGF0aWMgdm9pZCB4ZW5fYWN0aXZhdGVfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwgc3Ry dWN0IG1tX3N0cnVjdCAqbmV4dCkKK3sKKwlzcGluX2xvY2soJm5leHQtPnBhZ2VfdGFibGVfbG9j ayk7CisJeGVuX3BnZF9waW4obmV4dCk7CisJc3Bpbl91bmxvY2soJm5leHQtPnBhZ2VfdGFibGVf bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9kdXBfbW1hcChzdHJ1Y3QgbW1fc3RydWN0ICpv bGRtbSwgc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJs ZV9sb2NrKTsKKwl4ZW5fcGdkX3BpbihtbSk7CisJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxl X2xvY2spOworfQorCisKKyNpZmRlZiBDT05GSUdfU01QCisvKiBBbm90aGVyIGNwdSBtYXkgc3Rp bGwgaGF2ZSB0aGVpciAlY3IzIHBvaW50aW5nIGF0IHRoZSBwYWdldGFibGUsIHNvCisgICB3ZSBu ZWVkIHRvIHJlcG9pbnQgaXQgc29tZXdoZXJlIGVsc2UgYmVmb3JlIHdlIGNhbiB1bnBpbiBpdC4g Ki8KK3N0YXRpYyB2b2lkIGRyb3Bfb3RoZXJfbW1fcmVmKHZvaWQgKmluZm8pCit7CisJc3RydWN0 IG1tX3N0cnVjdCAqbW0gPSBpbmZvOworCXN0cnVjdCBtbV9zdHJ1Y3QgKmFjdGl2ZV9tbTsKKwor CWFjdGl2ZV9tbSA9IHRoaXNfY3B1X3JlYWQoY3B1X3RsYnN0YXRlLmFjdGl2ZV9tbSk7CisKKwlp ZiAoYWN0aXZlX21tID09IG1tICYmIHRoaXNfY3B1X3JlYWQoY3B1X3RsYnN0YXRlLnN0YXRlKSAh PSBUTEJTVEFURV9PSykKKwkJbGVhdmVfbW0oc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCS8qIElm IHRoaXMgY3B1IHN0aWxsIGhhcyBhIHN0YWxlIGNyMyByZWZlcmVuY2UsIHRoZW4gbWFrZSBzdXJl CisJICAgaXQgaGFzIGJlZW4gZmx1c2hlZC4gKi8KKwlpZiAodGhpc19jcHVfcmVhZCh4ZW5fY3Vy cmVudF9jcjMpID09IF9fcGEobW0tPnBnZCkpCisJCWxvYWRfY3IzKHN3YXBwZXJfcGdfZGlyKTsK K30KKworc3RhdGljIHZvaWQgeGVuX2Ryb3BfbW1fcmVmKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQor eworCWNwdW1hc2tfdmFyX3QgbWFzazsKKwl1bnNpZ25lZCBjcHU7CisKKwlpZiAoY3VycmVudC0+ YWN0aXZlX21tID09IG1tKSB7CisJCWlmIChjdXJyZW50LT5tbSA9PSBtbSkKKwkJCWxvYWRfY3Iz KHN3YXBwZXJfcGdfZGlyKTsKKwkJZWxzZQorCQkJbGVhdmVfbW0oc21wX3Byb2Nlc3Nvcl9pZCgp KTsKKwl9CisKKwkvKiBHZXQgdGhlICJvZmZpY2lhbCIgc2V0IG9mIGNwdXMgcmVmZXJyaW5nIHRv IG91ciBwYWdldGFibGUuICovCisJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmbWFzaywgR0ZQX0FU T01JQykpIHsKKwkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJCWlmICghY3B1bWFza190 ZXN0X2NwdShjcHUsIG1tX2NwdW1hc2sobW0pKQorCQkJICAgICYmIHBlcl9jcHUoeGVuX2N1cnJl bnRfY3IzLCBjcHUpICE9IF9fcGEobW0tPnBnZCkpCisJCQkJY29udGludWU7CisJCQlzbXBfY2Fs bF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBkcm9wX290aGVyX21tX3JlZiwgbW0sIDEpOworCQl9CisJ CXJldHVybjsKKwl9CisJY3B1bWFza19jb3B5KG1hc2ssIG1tX2NwdW1hc2sobW0pKTsKKworCS8q IEl0J3MgcG9zc2libGUgdGhhdCBhIHZjcHUgbWF5IGhhdmUgYSBzdGFsZSByZWZlcmVuY2UgdG8g b3VyCisJICAgY3IzLCBiZWNhdXNlIGl0cyBpbiBsYXp5IG1vZGUsIGFuZCBpdCBoYXNuJ3QgeWV0 IGZsdXNoZWQKKwkgICBpdHMgc2V0IG9mIHBlbmRpbmcgaHlwZXJjYWxscyB5ZXQuICBJbiB0aGlz IGNhc2UsIHdlIGNhbgorCSAgIGxvb2sgYXQgaXRzIGFjdHVhbCBjdXJyZW50IGNyMyB2YWx1ZSwg YW5kIGZvcmNlIGl0IHRvIGZsdXNoCisJICAgaWYgbmVlZGVkLiAqLworCWZvcl9lYWNoX29ubGlu ZV9jcHUoY3B1KSB7CisJCWlmIChwZXJfY3B1KHhlbl9jdXJyZW50X2NyMywgY3B1KSA9PSBfX3Bh KG1tLT5wZ2QpKQorCQkJY3B1bWFza19zZXRfY3B1KGNwdSwgbWFzayk7CisJfQorCisJaWYgKCFj cHVtYXNrX2VtcHR5KG1hc2spKQorCQlzbXBfY2FsbF9mdW5jdGlvbl9tYW55KG1hc2ssIGRyb3Bf b3RoZXJfbW1fcmVmLCBtbSwgMSk7CisJZnJlZV9jcHVtYXNrX3ZhcihtYXNrKTsKK30KKyNlbHNl CitzdGF0aWMgdm9pZCB4ZW5fZHJvcF9tbV9yZWYoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJ aWYgKGN1cnJlbnQtPmFjdGl2ZV9tbSA9PSBtbSkKKwkJbG9hZF9jcjMoc3dhcHBlcl9wZ19kaXIp OworfQorI2VuZGlmCisKKy8qCisgKiBXaGlsZSBhIHByb2Nlc3MgcnVucywgWGVuIHBpbnMgaXRz IHBhZ2V0YWJsZXMsIHdoaWNoIG1lYW5zIHRoYXQgdGhlCisgKiBoeXBlcnZpc29yIGZvcmNlcyBp dCB0byBiZSByZWFkLW9ubHksIGFuZCBpdCBjb250cm9scyBhbGwgdXBkYXRlcworICogdG8gaXQu ICBUaGlzIG1lYW5zIHRoYXQgYWxsIHBhZ2V0YWJsZSB1cGRhdGVzIGhhdmUgdG8gZ28gdmlhIHRo ZQorICogaHlwZXJ2aXNvciwgd2hpY2ggaXMgbW9kZXJhdGVseSBleHBlbnNpdmUuCisgKgorICog U2luY2Ugd2UncmUgcHVsbGluZyB0aGUgcGFnZXRhYmxlIGRvd24sIHdlIHN3aXRjaCB0byB1c2Ug aW5pdF9tbSwKKyAqIHVucGluIG9sZCBwcm9jZXNzIHBhZ2V0YWJsZSBhbmQgbWFyayBpdCBhbGwg cmVhZC13cml0ZSwgd2hpY2gKKyAqIGFsbG93cyBmdXJ0aGVyIG9wZXJhdGlvbnMgb24gaXQgdG8g YmUgc2ltcGxlIG1lbW9yeSBhY2Nlc3Nlcy4KKyAqCisgKiBUaGUgb25seSBzdWJ0bGUgcG9pbnQg aXMgdGhhdCBhbm90aGVyIENQVSBtYXkgYmUgc3RpbGwgdXNpbmcgdGhlCisgKiBwYWdldGFibGUg YmVjYXVzZSBvZiBsYXp5IHRsYiBmbHVzaGluZy4gIFRoaXMgbWVhbnMgd2UgbmVlZCBuZWVkIHRv CisgKiBzd2l0Y2ggYWxsIENQVXMgb2ZmIHRoaXMgcGFnZXRhYmxlIGJlZm9yZSB3ZSBjYW4gdW5w aW4gaXQuCisgKi8KK3N0YXRpYyB2b2lkIHhlbl9leGl0X21tYXAoc3RydWN0IG1tX3N0cnVjdCAq bW0pCit7CisJZ2V0X2NwdSgpOwkJLyogbWFrZSBzdXJlIHdlIGRvbid0IG1vdmUgYXJvdW5kICov CisJeGVuX2Ryb3BfbW1fcmVmKG1tKTsKKwlwdXRfY3B1KCk7CisKKwlzcGluX2xvY2soJm1tLT5w YWdlX3RhYmxlX2xvY2spOworCisJLyogcGdkIG1heSBub3QgYmUgcGlubmVkIGluIHRoZSBlcnJv ciBleGl0IHBhdGggb2YgZXhlY3ZlICovCisJaWYgKHhlbl9wYWdlX3Bpbm5lZChtbS0+cGdkKSkK KwkJeGVuX3BnZF91bnBpbihtbSk7CisKKwlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9j ayk7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9wb3N0X2FsbG9jYXRvcl9pbml0KHZvaWQpOworCitz dGF0aWMgdm9pZCBfX2luaXQgcGluX3BhZ2V0YWJsZV9wZm4odW5zaWduZWQgY21kLCB1bnNpZ25l ZCBsb25nIHBmbikKK3sKKwlzdHJ1Y3QgbW11ZXh0X29wIG9wOworCisJb3AuY21kID0gY21kOwor CW9wLmFyZzEubWZuID0gcGZuX3RvX21mbihwZm4pOworCWlmIChIWVBFUlZJU09SX21tdWV4dF9v cCgmb3AsIDEsIE5VTEwsIERPTUlEX1NFTEYpKQorCQlCVUcoKTsKK30KKworI2lmZGVmIENPTkZJ R19YODZfNjQKK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5fY2xlYW5oaWdobWFwKHVuc2lnbmVkIGxv bmcgdmFkZHIsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgdmFkZHJfZW5kKQoreworCXVuc2lnbmVk IGxvbmcga2VybmVsX2VuZCA9IHJvdW5kdXAoKHVuc2lnbmVkIGxvbmcpX2Jya19lbmQsIFBNRF9T SVpFKSAtIDE7CisJcG1kX3QgKnBtZCA9IGxldmVsMl9rZXJuZWxfcGd0ICsgcG1kX2luZGV4KHZh ZGRyKTsKKworCS8qIE5PVEU6IFRoZSBsb29wIGlzIG1vcmUgZ3JlZWR5IHRoYW4gdGhlIGNsZWFu dXBfaGlnaG1hcCB2YXJpYW50LgorCSAqIFdlIGluY2x1ZGUgdGhlIFBNRCBwYXNzZWQgaW4gb24g X2JvdGhfIGJvdW5kYXJpZXMuICovCisJZm9yICg7IHZhZGRyIDw9IHZhZGRyX2VuZCAmJiAocG1k IDwgKGxldmVsMl9rZXJuZWxfcGd0ICsgUFRSU19QRVJfUE1EKSk7CisJCQlwbWQrKywgdmFkZHIg Kz0gUE1EX1NJWkUpIHsKKwkJaWYgKHBtZF9ub25lKCpwbWQpKQorCQkJY29udGludWU7CisJCWlm ICh2YWRkciA8ICh1bnNpZ25lZCBsb25nKSBfdGV4dCB8fCB2YWRkciA+IGtlcm5lbF9lbmQpCisJ CQlzZXRfcG1kKHBtZCwgX19wbWQoMCkpOworCX0KKwkvKiBJbiBjYXNlIHdlIGRpZCBzb21ldGhp bmcgc2lsbHksIHdlIHNob3VsZCBjcmFzaCBpbiB0aGlzIGZ1bmN0aW9uCisJICogaW5zdGVhZCBv ZiBzb21ld2hlcmUgbGF0ZXIgYW5kIGJlIGNvbmZ1c2luZy4gKi8KKwl4ZW5fbWNfZmx1c2goKTsK K30KKworLyoKKyAqIE1ha2UgYSBwYWdlIHJhbmdlIHdyaXRlYWJsZSBhbmQgZnJlZSBpdC4KKyAq Lworc3RhdGljIHZvaWQgX19pbml0IHhlbl9mcmVlX3JvX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGFk ZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl2b2lkICp2YWRkciA9IF9fdmEocGFkZHIpOwor CXZvaWQgKnZhZGRyX2VuZCA9IHZhZGRyICsgc2l6ZTsKKworCWZvciAoOyB2YWRkciA8IHZhZGRy X2VuZDsgdmFkZHIgKz0gUEFHRV9TSVpFKQorCQltYWtlX2xvd21lbV9wYWdlX3JlYWR3cml0ZSh2 YWRkcik7CisKKwltZW1ibG9ja19mcmVlKHBhZGRyLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQg X19pbml0IHhlbl9jbGVhbm1mbm1hcF9mcmVlX3BndGJsKHZvaWQgKnBndGJsLCBib29sIHVucGlu KQoreworCXVuc2lnbmVkIGxvbmcgcGEgPSBfX3BhKHBndGJsKSAmIFBIWVNJQ0FMX1BBR0VfTUFT SzsKKworCWlmICh1bnBpbikKKwkJcGluX3BhZ2V0YWJsZV9wZm4oTU1VRVhUX1VOUElOX1RBQkxF LCBQRk5fRE9XTihwYSkpOworCUNsZWFyUGFnZVBpbm5lZCh2aXJ0X3RvX3BhZ2UoX192YShwYSkp KTsKKwl4ZW5fZnJlZV9yb19wYWdlcyhwYSwgUEFHRV9TSVpFKTsKK30KKworLyoKKyAqIFNpbmNl IGl0IGlzIHdlbGwgaXNvbGF0ZWQgd2UgY2FuIChhbmQgc2luY2UgaXQgaXMgcGVyaGFwcyBsYXJn ZSB3ZSBzaG91bGQpCisgKiBhbHNvIGZyZWUgdGhlIHBhZ2UgdGFibGVzIG1hcHBpbmcgdGhlIGlu aXRpYWwgUC0+TSB0YWJsZS4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHhlbl9jbGVhbm1mbm1h cCh1bnNpZ25lZCBsb25nIHZhZGRyKQoreworCXVuc2lnbmVkIGxvbmcgdmEgPSB2YWRkciAmIFBN RF9NQVNLOworCXVuc2lnbmVkIGxvbmcgcGE7CisJcGdkX3QgKnBnZCA9IHBnZF9vZmZzZXRfayh2 YSk7CisJcHVkX3QgKnB1ZF9wYWdlID0gcHVkX29mZnNldChwZ2QsIDApOworCXB1ZF90ICpwdWQ7 CisJcG1kX3QgKnBtZDsKKwlwdGVfdCAqcHRlOworCXVuc2lnbmVkIGludCBpOworCWJvb2wgdW5w aW47CisKKwl1bnBpbiA9ICh2YWRkciA9PSAyICogUEdESVJfU0laRSk7CisJc2V0X3BnZChwZ2Qs IF9fcGdkKDApKTsKKwlkbyB7CisJCXB1ZCA9IHB1ZF9wYWdlICsgcHVkX2luZGV4KHZhKTsKKwkJ aWYgKHB1ZF9ub25lKCpwdWQpKSB7CisJCQl2YSArPSBQVURfU0laRTsKKwkJfSBlbHNlIGlmIChw dWRfbGFyZ2UoKnB1ZCkpIHsKKwkJCXBhID0gcHVkX3ZhbCgqcHVkKSAmIFBIWVNJQ0FMX1BBR0Vf TUFTSzsKKwkJCXhlbl9mcmVlX3JvX3BhZ2VzKHBhLCBQVURfU0laRSk7CisJCQl2YSArPSBQVURf U0laRTsKKwkJfSBlbHNlIHsKKwkJCXBtZCA9IHBtZF9vZmZzZXQocHVkLCB2YSk7CisJCQlpZiAo cG1kX2xhcmdlKCpwbWQpKSB7CisJCQkJcGEgPSBwbWRfdmFsKCpwbWQpICYgUEhZU0lDQUxfUEFH RV9NQVNLOworCQkJCXhlbl9mcmVlX3JvX3BhZ2VzKHBhLCBQTURfU0laRSk7CisJCQl9IGVsc2Ug aWYgKCFwbWRfbm9uZSgqcG1kKSkgeworCQkJCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwg dmEpOworCQkJCXNldF9wbWQocG1kLCBfX3BtZCgwKSk7CisJCQkJZm9yIChpID0gMDsgaSA8IFBU UlNfUEVSX1BURTsgKytpKSB7CisJCQkJCWlmIChwdGVfbm9uZShwdGVbaV0pKQorCQkJCQkJYnJl YWs7CisJCQkJCXBhID0gcHRlX3BmbihwdGVbaV0pIDw8IFBBR0VfU0hJRlQ7CisJCQkJCXhlbl9m cmVlX3JvX3BhZ2VzKHBhLCBQQUdFX1NJWkUpOworCQkJCX0KKwkJCQl4ZW5fY2xlYW5tZm5tYXBf ZnJlZV9wZ3RibChwdGUsIHVucGluKTsKKwkJCX0KKwkJCXZhICs9IFBNRF9TSVpFOworCQkJaWYg KHBtZF9pbmRleCh2YSkpCisJCQkJY29udGludWU7CisJCQlzZXRfcHVkKHB1ZCwgX19wdWQoMCkp OworCQkJeGVuX2NsZWFubWZubWFwX2ZyZWVfcGd0YmwocG1kLCB1bnBpbik7CisJCX0KKworCX0g d2hpbGUgKHB1ZF9pbmRleCh2YSkgfHwgcG1kX2luZGV4KHZhKSk7CisJeGVuX2NsZWFubWZubWFw X2ZyZWVfcGd0YmwocHVkX3BhZ2UsIHVucGluKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHhl bl9wYWdldGFibGVfcDJtX2ZyZWUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5z aWduZWQgbG9uZyBhZGRyOworCisJc2l6ZSA9IFBBR0VfQUxJR04oeGVuX3N0YXJ0X2luZm8tPm5y X3BhZ2VzICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKworCS8qIE5vIG1lbW9yeSBvciBhbHJl YWR5IGNhbGxlZC4gKi8KKwlpZiAoKHVuc2lnbmVkIGxvbmcpeGVuX3AybV9hZGRyID09IHhlbl9z dGFydF9pbmZvLT5tZm5fbGlzdCkKKwkJcmV0dXJuOworCisJLyogdXNpbmcgX19rYSBhZGRyZXNz IGFuZCBzdGlja2luZyBJTlZBTElEX1AyTV9FTlRSWSEgKi8KKwltZW1zZXQoKHZvaWQgKil4ZW5f c3RhcnRfaW5mby0+bWZuX2xpc3QsIDB4ZmYsIHNpemUpOworCisJYWRkciA9IHhlbl9zdGFydF9p bmZvLT5tZm5fbGlzdDsKKwkvKgorCSAqIFdlIGNvdWxkIGJlIGluIF9fa2Egc3BhY2UuCisJICog V2Ugcm91bmR1cCB0byB0aGUgUE1ELCB3aGljaCBtZWFucyB0aGF0IGlmIGFueWJvZHkgYXQgdGhp cyBzdGFnZSBpcworCSAqIHVzaW5nIHRoZSBfX2thIGFkZHJlc3Mgb2YgeGVuX3N0YXJ0X2luZm8g b3IKKwkgKiB4ZW5fc3RhcnRfaW5mby0+c2hhcmVkX2luZm8gdGhleSBhcmUgaW4gZ29pbmcgdG8g Y3Jhc2guIEZvcnR1bmF0bHkKKwkgKiB3ZSBoYXZlIGFscmVhZHkgcmV2ZWN0b3JlZCBpbiB4ZW5f c2V0dXBfa2VybmVsX3BhZ2V0YWJsZSBhbmQgaW4KKwkgKiB4ZW5fc2V0dXBfc2hhcmVkX2luZm8u CisJICovCisJc2l6ZSA9IHJvdW5kdXAoc2l6ZSwgUE1EX1NJWkUpOworCisJaWYgKGFkZHIgPj0g X19TVEFSVF9LRVJORUxfbWFwKSB7CisJCXhlbl9jbGVhbmhpZ2htYXAoYWRkciwgYWRkciArIHNp emUpOworCQlzaXplID0gUEFHRV9BTElHTih4ZW5fc3RhcnRfaW5mby0+bnJfcGFnZXMgKgorCQkJ CSAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwkJbWVtYmxvY2tfZnJlZShfX3BhKGFkZHIpLCBz aXplKTsKKwl9IGVsc2UgeworCQl4ZW5fY2xlYW5tZm5tYXAoYWRkcik7CisJfQorfQorCitzdGF0 aWMgdm9pZCBfX2luaXQgeGVuX3BhZ2V0YWJsZV9jbGVhbmhpZ2htYXAodm9pZCkKK3sKKwl1bnNp Z25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJLyogQXQgdGhpcyBzdGFn ZSwgY2xlYW51cF9oaWdobWFwIGhhcyBhbHJlYWR5IGNsZWFuZWQgX19rYSBzcGFjZQorCSAqIGZy b20gX2Jya19saW1pdCB3YXkgdXAgdG8gdGhlIG1heF9wZm5fbWFwcGVkICh3aGljaCBpcyB0aGUg ZW5kIG9mCisJICogdGhlIHJhbWRpc2spLiBXZSBjb250aW51ZSBvbiwgZXJhc2luZyBQTUQgZW50 cmllcyB0aGF0IHBvaW50IHRvIHBhZ2UKKwkgKiB0YWJsZXMgLSBkbyBub3RlIHRoYXQgdGhleSBh cmUgYWNjZXNzaWJsZSBhdCB0aGlzIHN0YWdlIHZpYSBfX3ZhLgorCSAqIEZvciBnb29kIG1lYXN1 cmUgd2UgYWxzbyByb3VuZCB1cCB0byB0aGUgUE1EIC0gd2hpY2ggbWVhbnMgdGhhdCBpZgorCSAq IGFueWJvZHkgaXMgdXNpbmcgX19rYSBhZGRyZXNzIHRvIHRoZSBpbml0aWFsIGJvb3Qtc3RhY2sg LSBhbmQgdHJ5CisJICogdG8gdXNlIGl0IC0gdGhleSBhcmUgZ29pbmcgdG8gY3Jhc2guIFRoZSB4 ZW5fc3RhcnRfaW5mbyBoYXMgYmVlbgorCSAqIHRha2VuIGNhcmUgb2YgYWxyZWFkeSBpbiB4ZW5f c2V0dXBfa2VybmVsX3BhZ2V0YWJsZS4gKi8KKwlhZGRyID0geGVuX3N0YXJ0X2luZm8tPnB0X2Jh c2U7CisJc2l6ZSA9IHJvdW5kdXAoeGVuX3N0YXJ0X2luZm8tPm5yX3B0X2ZyYW1lcyAqIFBBR0Vf U0laRSwgUE1EX1NJWkUpOworCisJeGVuX2NsZWFuaGlnaG1hcChhZGRyLCBhZGRyICsgc2l6ZSk7 CisJeGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2UgPSAodW5zaWduZWQgbG9uZylfX3ZhKF9fcGEoeGVu X3N0YXJ0X2luZm8tPnB0X2Jhc2UpKTsKKyNpZmRlZiBERUJVRworCS8qIFRoaXMgaXMgc3VwZXJm bHVvdXMgYW5kIGlzIG5vdCBuZWNlc3NhcnksIGJ1dCB5b3Uga25vdyB3aGF0CisJICogbGV0cyBk byBpdC4gVGhlIE1PRFVMRVNfVkFERFIgLT4gTU9EVUxFU19FTkQgc2hvdWxkIGJlIGNsZWFyIG9m CisJICogYW55dGhpbmcgYXQgdGhpcyBzdGFnZS4gKi8KKwl4ZW5fY2xlYW5oaWdobWFwKE1PRFVM RVNfVkFERFIsIHJvdW5kdXAoTU9EVUxFU19WQUREUiwgUFVEX1NJWkUpIC0gMSk7CisjZW5kaWYK K30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfX2luaXQgeGVuX3BhZ2V0YWJsZV9wMm1fc2V0dXAo dm9pZCkKK3sKKwlpZiAoeGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21h cCkpCisJCXJldHVybjsKKworCXhlbl92bWFsbG9jX3AybV90cmVlKCk7CisKKyNpZmRlZiBDT05G SUdfWDg2XzY0CisJeGVuX3BhZ2V0YWJsZV9wMm1fZnJlZSgpOworCisJeGVuX3BhZ2V0YWJsZV9j bGVhbmhpZ2htYXAoKTsKKyNlbmRpZgorCS8qIEFuZCByZXZlY3RvciEgQnllIGJ5ZSBvbGQgYXJy YXkgKi8KKwl4ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3QgPSAodW5zaWduZWQgbG9uZyl4ZW5fcDJt X2FkZHI7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5fcGFnZXRhYmxlX2luaXQodm9pZCkK K3sKKwlwYWdpbmdfaW5pdCgpOworCXhlbl9wb3N0X2FsbG9jYXRvcl9pbml0KCk7CisKKwl4ZW5f cGFnZXRhYmxlX3AybV9zZXR1cCgpOworCisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdG9w IGFuZCBtaWQgbWZuIGxldmVscyBmb3IgcDJtIHN0cnVjdHVyZSAqLworCXhlbl9idWlsZF9tZm5f bGlzdF9saXN0KCk7CisKKwkvKiBSZW1hcCBtZW1vcnkgZnJlZWQgZHVlIHRvIGNvbmZsaWN0cyB3 aXRoIEU4MjAgbWFwICovCisJaWYgKCF4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRl ZF9waHlzbWFwKSkKKwkJeGVuX3JlbWFwX21lbW9yeSgpOworCisjaWZkZWYgQ09ORklHX1hFTl9Q VgorCXhlbl9zZXR1cF9zaGFyZWRfaW5mbygpOworI2VuZGlmCit9CitzdGF0aWMgdm9pZCB4ZW5f d3JpdGVfY3IyKHVuc2lnbmVkIGxvbmcgY3IyKQoreworCXRoaXNfY3B1X3JlYWQoeGVuX3ZjcHUp LT5hcmNoLmNyMiA9IGNyMjsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgeGVuX3JlYWRfY3Iy KHZvaWQpCit7CisJcmV0dXJuIHRoaXNfY3B1X3JlYWQoeGVuX3ZjcHUpLT5hcmNoLmNyMjsKK30K KwordW5zaWduZWQgbG9uZyB4ZW5fcmVhZF9jcjJfZGlyZWN0KHZvaWQpCit7CisJcmV0dXJuIHRo aXNfY3B1X3JlYWQoeGVuX3ZjcHVfaW5mby5hcmNoLmNyMik7Cit9CisKK3N0YXRpYyB2b2lkIHhl bl9mbHVzaF90bGIodm9pZCkKK3sKKwlzdHJ1Y3QgbW11ZXh0X29wICpvcDsKKwlzdHJ1Y3QgbXVs dGljYWxsX3NwYWNlIG1jczsKKworCXRyYWNlX3hlbl9tbXVfZmx1c2hfdGxiKDApOworCisJcHJl ZW1wdF9kaXNhYmxlKCk7CisKKwltY3MgPSB4ZW5fbWNfZW50cnkoc2l6ZW9mKCpvcCkpOworCisJ b3AgPSBtY3MuYXJnczsKKwlvcC0+Y21kID0gTU1VRVhUX1RMQl9GTFVTSF9MT0NBTDsKKwlNVUxU SV9tbXVleHRfb3AobWNzLm1jLCBvcCwgMSwgTlVMTCwgRE9NSURfU0VMRik7CisKKwl4ZW5fbWNf aXNzdWUoUEFSQVZJUlRfTEFaWV9NTVUpOworCisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworc3Rh dGljIHZvaWQgeGVuX2ZsdXNoX3RsYl9zaW5nbGUodW5zaWduZWQgbG9uZyBhZGRyKQoreworCXN0 cnVjdCBtbXVleHRfb3AgKm9wOworCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzOworCisJdHJh Y2VfeGVuX21tdV9mbHVzaF90bGJfc2luZ2xlKGFkZHIpOworCisJcHJlZW1wdF9kaXNhYmxlKCk7 CisKKwltY3MgPSB4ZW5fbWNfZW50cnkoc2l6ZW9mKCpvcCkpOworCW9wID0gbWNzLmFyZ3M7CisJ b3AtPmNtZCA9IE1NVUVYVF9JTlZMUEdfTE9DQUw7CisJb3AtPmFyZzEubGluZWFyX2FkZHIgPSBh ZGRyICYgUEFHRV9NQVNLOworCU1VTFRJX21tdWV4dF9vcChtY3MubWMsIG9wLCAxLCBOVUxMLCBE T01JRF9TRUxGKTsKKworCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX01NVSk7CisKKwlwcmVl bXB0X2VuYWJsZSgpOworfQorCitzdGF0aWMgdm9pZCB4ZW5fZmx1c2hfdGxiX290aGVycyhjb25z dCBzdHJ1Y3QgY3B1bWFzayAqY3B1cywKKwkJCQkgc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2ln bmVkIGxvbmcgc3RhcnQsCisJCQkJIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0cnVjdCB7CisJ CXN0cnVjdCBtbXVleHRfb3Agb3A7CisjaWZkZWYgQ09ORklHX1NNUAorCQlERUNMQVJFX0JJVE1B UChtYXNrLCBudW1fcHJvY2Vzc29ycyk7CisjZWxzZQorCQlERUNMQVJFX0JJVE1BUChtYXNrLCBO Ul9DUFVTKTsKKyNlbmRpZgorCX0gKmFyZ3M7CisJc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7 CisKKwl0cmFjZV94ZW5fbW11X2ZsdXNoX3RsYl9vdGhlcnMoY3B1cywgbW0sIHN0YXJ0LCBlbmQp OworCisJaWYgKGNwdW1hc2tfZW1wdHkoY3B1cykpCisJCXJldHVybjsJCS8qIG5vdGhpbmcgdG8g ZG8gKi8KKworCW1jcyA9IHhlbl9tY19lbnRyeShzaXplb2YoKmFyZ3MpKTsKKwlhcmdzID0gbWNz LmFyZ3M7CisJYXJncy0+b3AuYXJnMi52Y3B1bWFzayA9IHRvX2NwdW1hc2soYXJncy0+bWFzayk7 CisKKwkvKiBSZW1vdmUgdXMsIGFuZCBhbnkgb2ZmbGluZSBDUFVTLiAqLworCWNwdW1hc2tfYW5k KHRvX2NwdW1hc2soYXJncy0+bWFzayksIGNwdXMsIGNwdV9vbmxpbmVfbWFzayk7CisJY3B1bWFz a19jbGVhcl9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpLCB0b19jcHVtYXNrKGFyZ3MtPm1hc2spKTsK KworCWFyZ3MtPm9wLmNtZCA9IE1NVUVYVF9UTEJfRkxVU0hfTVVMVEk7CisJaWYgKGVuZCAhPSBU TEJfRkxVU0hfQUxMICYmIChlbmQgLSBzdGFydCkgPD0gUEFHRV9TSVpFKSB7CisJCWFyZ3MtPm9w LmNtZCA9IE1NVUVYVF9JTlZMUEdfTVVMVEk7CisJCWFyZ3MtPm9wLmFyZzEubGluZWFyX2FkZHIg PSBzdGFydDsKKwl9CisKKwlNVUxUSV9tbXVleHRfb3AobWNzLm1jLCAmYXJncy0+b3AsIDEsIE5V TEwsIERPTUlEX1NFTEYpOworCisJeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfTU1VKTsKK30K Kworc3RhdGljIHVuc2lnbmVkIGxvbmcgeGVuX3JlYWRfY3IzKHZvaWQpCit7CisJcmV0dXJuIHRo aXNfY3B1X3JlYWQoeGVuX2NyMyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9jdXJyZW50X2NyMyh2 b2lkICp2KQoreworCXRoaXNfY3B1X3dyaXRlKHhlbl9jdXJyZW50X2NyMywgKHVuc2lnbmVkIGxv bmcpdik7Cit9CisKK3N0YXRpYyB2b2lkIF9feGVuX3dyaXRlX2NyMyhib29sIGtlcm5lbCwgdW5z aWduZWQgbG9uZyBjcjMpCit7CisJc3RydWN0IG1tdWV4dF9vcCBvcDsKKwl1bnNpZ25lZCBsb25n IG1mbjsKKworCXRyYWNlX3hlbl9tbXVfd3JpdGVfY3IzKGtlcm5lbCwgY3IzKTsKKworCWlmIChj cjMpCisJCW1mbiA9IHBmbl90b19tZm4oUEZOX0RPV04oY3IzKSk7CisJZWxzZQorCQltZm4gPSAw OworCisJV0FSTl9PTihtZm4gPT0gMCAmJiBrZXJuZWwpOworCisJb3AuY21kID0ga2VybmVsID8g TU1VRVhUX05FV19CQVNFUFRSIDogTU1VRVhUX05FV19VU0VSX0JBU0VQVFI7CisJb3AuYXJnMS5t Zm4gPSBtZm47CisKKwl4ZW5fZXh0ZW5kX21tdWV4dF9vcCgmb3ApOworCisJaWYgKGtlcm5lbCkg eworCQl0aGlzX2NwdV93cml0ZSh4ZW5fY3IzLCBjcjMpOworCisJCS8qIFVwZGF0ZSB4ZW5fY3Vy cmVudF9jcjMgb25jZSB0aGUgYmF0Y2ggaGFzIGFjdHVhbGx5CisJCSAgIGJlZW4gc3VibWl0dGVk LiAqLworCQl4ZW5fbWNfY2FsbGJhY2soc2V0X2N1cnJlbnRfY3IzLCAodm9pZCAqKWNyMyk7CisJ fQorfQorc3RhdGljIHZvaWQgeGVuX3dyaXRlX2NyMyh1bnNpZ25lZCBsb25nIGNyMykKK3sKKwlC VUdfT04ocHJlZW1wdGlibGUoKSk7CisKKwl4ZW5fbWNfYmF0Y2goKTsgIC8qIGRpc2FibGVzIGlu dGVycnVwdHMgKi8KKworCS8qIFVwZGF0ZSB3aGlsZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwg c28gaXRzIGF0b21pYyB3aXRoCisJICAgcmVzcGVjdCB0byBpcGlzICovCisJdGhpc19jcHVfd3Jp dGUoeGVuX2NyMywgY3IzKTsKKworCV9feGVuX3dyaXRlX2NyMyh0cnVlLCBjcjMpOworCisjaWZk ZWYgQ09ORklHX1g4Nl82NAorCXsKKwkJcGdkX3QgKnVzZXJfcGdkID0geGVuX2dldF91c2VyX3Bn ZChfX3ZhKGNyMykpOworCQlpZiAodXNlcl9wZ2QpCisJCQlfX3hlbl93cml0ZV9jcjMoZmFsc2Us IF9fcGEodXNlcl9wZ2QpKTsKKwkJZWxzZQorCQkJX194ZW5fd3JpdGVfY3IzKGZhbHNlLCAwKTsK Kwl9CisjZW5kaWYKKworCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX0NQVSk7ICAvKiBpbnRl cnJ1cHRzIHJlc3RvcmVkICovCit9CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisvKgorICogQXQg dGhlIHN0YXJ0IG9mIHRoZSBkYXkgLSB3aGVuIFhlbiBsYXVuY2hlcyBhIGd1ZXN0LCBpdCBoYXMg YWxyZWFkeQorICogYnVpbHQgcGFnZXRhYmxlcyBmb3IgdGhlIGd1ZXN0LiBXZSBkaWxpZ2VudGx5 IGxvb2sgb3ZlciB0aGVtCisgKiBpbiB4ZW5fc2V0dXBfa2VybmVsX3BhZ2V0YWJsZSBhbmQgZ3Jh ZnQgYXMgYXBwcm9wcmlhdGUgdGhlbSBpbiB0aGUKKyAqIGluaXRfbGV2ZWw0X3BndCBhbmQgaXRz IGZyaWVuZHMuIFRoZW4gd2hlbiB3ZSBhcmUgaGFwcHkgd2UgbG9hZAorICogdGhlIG5ldyBpbml0 X2xldmVsNF9wZ3QgLSBhbmQgY29udGludWUgb24uCisgKgorICogVGhlIGdlbmVyaWMgY29kZSBz dGFydHMgKHN0YXJ0X2tlcm5lbCkgYW5kICdpbml0X21lbV9tYXBwaW5nJyBzZXRzCisgKiB1cCB0 aGUgcmVzdCBvZiB0aGUgcGFnZXRhYmxlcy4gV2hlbiBpdCBoYXMgY29tcGxldGVkIGl0IGxvYWRz IHRoZSBjcjMuCisgKiBOLkIuIHRoYXQgYmFyZW1ldGFsIHdvdWxkIHN0YXJ0IGF0ICdzdGFydF9r ZXJuZWwnIChhbmQgdGhlIGVhcmx5CisgKiAjUEYgaGFuZGxlciB3b3VsZCBjcmVhdGUgYm9vdHN0 cmFwIHBhZ2V0YWJsZXMpIC0gc28gd2UgYXJlIHJ1bm5pbmcKKyAqIHdpdGggdGhlIHNhbWUgYXNz dW1wdGlvbnMgYXMgd2hhdCB0byBkbyB3aGVuIHdyaXRlX2NyMyBpcyBleGVjdXRlZAorICogYXQg dGhpcyBwb2ludC4KKyAqCisgKiBTaW5jZSB0aGVyZSBhcmUgbm8gdXNlci1wYWdlIHRhYmxlcyBh dCBhbGwsIHdlIGhhdmUgdHdvIHZhcmlhbnRzCisgKiBvZiB4ZW5fd3JpdGVfY3IzIC0gdGhlIGVh cmx5IGJvb3R1cCAodGhpcyBvbmUpLCBhbmQgdGhlIGxhdGUgb25lCisgKiAoeGVuX3dyaXRlX2Ny MykuIFRoZSByZWFzb24gd2UgaGF2ZSB0byBkbyB0aGF0IGlzIHRoYXQgaW4gNjQtYml0CisgKiB0 aGUgTGludXgga2VybmVsIGFuZCB1c2VyLXNwYWNlIGFyZSBib3RoIGluIHJpbmcgMyB3aGlsZSB0 aGUKKyAqIGh5cGVydmlzb3IgaXMgaW4gcmluZyAwLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQg eGVuX3dyaXRlX2NyM19pbml0KHVuc2lnbmVkIGxvbmcgY3IzKQoreworCUJVR19PTihwcmVlbXB0 aWJsZSgpKTsKKworCXhlbl9tY19iYXRjaCgpOyAgLyogZGlzYWJsZXMgaW50ZXJydXB0cyAqLwor CisJLyogVXBkYXRlIHdoaWxlIGludGVycnVwdHMgYXJlIGRpc2FibGVkLCBzbyBpdHMgYXRvbWlj IHdpdGgKKwkgICByZXNwZWN0IHRvIGlwaXMgKi8KKwl0aGlzX2NwdV93cml0ZSh4ZW5fY3IzLCBj cjMpOworCisJX194ZW5fd3JpdGVfY3IzKHRydWUsIGNyMyk7CisKKwl4ZW5fbWNfaXNzdWUoUEFS QVZJUlRfTEFaWV9DUFUpOyAgLyogaW50ZXJydXB0cyByZXN0b3JlZCAqLworfQorI2VuZGlmCisK K3N0YXRpYyBpbnQgeGVuX3BnZF9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlwZ2Rf dCAqcGdkID0gbW0tPnBnZDsKKwlpbnQgcmV0ID0gMDsKKworCUJVR19PTihQYWdlUGlubmVkKHZp cnRfdG9fcGFnZShwZ2QpKSk7CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJeworCQlzdHJ1Y3Qg cGFnZSAqcGFnZSA9IHZpcnRfdG9fcGFnZShwZ2QpOworCQlwZ2RfdCAqdXNlcl9wZ2Q7CisKKwkJ QlVHX09OKHBhZ2UtPnByaXZhdGUgIT0gMCk7CisKKwkJcmV0ID0gLUVOT01FTTsKKworCQl1c2Vy X3BnZCA9IChwZ2RfdCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7 CisJCXBhZ2UtPnByaXZhdGUgPSAodW5zaWduZWQgbG9uZyl1c2VyX3BnZDsKKworCQlpZiAodXNl cl9wZ2QgIT0gTlVMTCkgeworI2lmZGVmIENPTkZJR19YODZfVlNZU0NBTExfRU1VTEFUSU9OCisJ CQl1c2VyX3BnZFtwZ2RfaW5kZXgoVlNZU0NBTExfQUREUildID0KKwkJCQlfX3BnZChfX3BhKGxl dmVsM191c2VyX3ZzeXNjYWxsKSB8IF9QQUdFX1RBQkxFKTsKKyNlbmRpZgorCQkJcmV0ID0gMDsK KwkJfQorCisJCUJVR19PTihQYWdlUGlubmVkKHZpcnRfdG9fcGFnZSh4ZW5fZ2V0X3VzZXJfcGdk KHBnZCkpKSk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB4 ZW5fcGdkX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QpCit7CisjaWZkZWYg Q09ORklHX1g4Nl82NAorCXBnZF90ICp1c2VyX3BnZCA9IHhlbl9nZXRfdXNlcl9wZ2QocGdkKTsK KworCWlmICh1c2VyX3BnZCkKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXVzZXJfcGdkKTsK KyNlbmRpZgorfQorCisvKgorICogSW5pdC10aW1lIHNldF9wdGUgd2hpbGUgY29uc3RydWN0aW5n IGluaXRpYWwgcGFnZXRhYmxlcywgd2hpY2gKKyAqIGRvZXNuJ3QgYWxsb3cgUk8gcGFnZSB0YWJs ZSBwYWdlcyB0byBiZSByZW1hcHBlZCBSVy4KKyAqCisgKiBJZiB0aGVyZSBpcyBubyBNRk4gZm9y IHRoaXMgUEZOIHRoZW4gdGhpcyBwYWdlIGlzIGluaXRpYWxseQorICogYmFsbG9vbmVkIG91dCBz byBjbGVhciB0aGUgUFRFIChhcyBpbiBkZWNyZWFzZV9yZXNlcnZhdGlvbigpIGluCisgKiBkcml2 ZXJzL3hlbi9iYWxsb29uLmMpLgorICoKKyAqIE1hbnkgb2YgdGhlc2UgUFRFIHVwZGF0ZXMgYXJl IGRvbmUgb24gdW5waW5uZWQgYW5kIHdyaXRhYmxlIHBhZ2VzCisgKiBhbmQgZG9pbmcgYSBoeXBl cmNhbGwgZm9yIHRoZXNlIGlzIHVubmVjZXNzYXJ5IGFuZCBleHBlbnNpdmUuICBBdAorICogdGhp cyBwb2ludCBpdCBpcyBub3QgcG9zc2libGUgdG8gdGVsbCBpZiBhIHBhZ2UgaXMgcGlubmVkIG9y IG5vdCwKKyAqIHNvIGFsd2F5cyB3cml0ZSB0aGUgUFRFIGRpcmVjdGx5IGFuZCByZWx5IG9uIFhl biB0cmFwcGluZyBhbmQKKyAqIGVtdWxhdGluZyBhbnkgdXBkYXRlcyBhcyBuZWNlc3NhcnkuCisg Ki8KK19fdmlzaWJsZSBwdGVfdCB4ZW5fbWFrZV9wdGVfaW5pdChwdGV2YWxfdCBwdGUpCit7Cisj aWZkZWYgQ09ORklHX1g4Nl82NAorCXVuc2lnbmVkIGxvbmcgcGZuOworCisJLyoKKwkgKiBQYWdl cyBiZWxvbmdpbmcgdG8gdGhlIGluaXRpYWwgcDJtIGxpc3QgbWFwcGVkIG91dHNpZGUgdGhlIGRl ZmF1bHQKKwkgKiBhZGRyZXNzIHJhbmdlIG11c3QgYmUgbWFwcGVkIHJlYWQtb25seS4gVGhpcyBy ZWdpb24gY29udGFpbnMgdGhlCisJICogcGFnZSB0YWJsZXMgZm9yIG1hcHBpbmcgdGhlIHAybSBs aXN0LCB0b28sIGFuZCBwYWdlIHRhYmxlcyBNVVNUIGJlCisJICogbWFwcGVkIHJlYWQtb25seS4K KwkgKi8KKwlwZm4gPSAocHRlICYgUFRFX1BGTl9NQVNLKSA+PiBQQUdFX1NISUZUOworCWlmICh4 ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3QgPCBfX1NUQVJUX0tFUk5FTF9tYXAgJiYKKwkgICAgcGZu ID49IHhlbl9zdGFydF9pbmZvLT5maXJzdF9wMm1fcGZuICYmCisJICAgIHBmbiA8IHhlbl9zdGFy dF9pbmZvLT5maXJzdF9wMm1fcGZuICsgeGVuX3N0YXJ0X2luZm8tPm5yX3AybV9mcmFtZXMpCisJ CXB0ZSAmPSB+X1BBR0VfUlc7CisjZW5kaWYKKwlwdGUgPSBwdGVfcGZuX3RvX21mbihwdGUpOwor CXJldHVybiBuYXRpdmVfbWFrZV9wdGUocHRlKTsKK30KK1BWX0NBTExFRV9TQVZFX1JFR1NfVEhV TksoeGVuX21ha2VfcHRlX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2luaXQgeGVuX3NldF9wdGVf aW5pdChwdGVfdCAqcHRlcCwgcHRlX3QgcHRlKQoreworI2lmZGVmIENPTkZJR19YODZfMzIKKwkv KiBJZiB0aGVyZSdzIGFuIGV4aXN0aW5nIHB0ZSwgdGhlbiBkb24ndCBhbGxvdyBfUEFHRV9SVyB0 byBiZSBzZXQgKi8KKwlpZiAocHRlX21mbihwdGUpICE9IElOVkFMSURfUDJNX0VOVFJZCisJICAg ICYmIHB0ZV92YWxfbWEoKnB0ZXApICYgX1BBR0VfUFJFU0VOVCkKKwkJcHRlID0gX19wdGVfbWEo KChwdGVfdmFsX21hKCpwdGVwKSAmIF9QQUdFX1JXKSB8IH5fUEFHRV9SVykgJgorCQkJICAgICAg IHB0ZV92YWxfbWEocHRlKSk7CisjZW5kaWYKKwluYXRpdmVfc2V0X3B0ZShwdGVwLCBwdGUpOwor fQorCisvKiBFYXJseSBpbiBib290LCB3aGlsZSBzZXR0aW5nIHVwIHRoZSBpbml0aWFsIHBhZ2V0 YWJsZSwgYXNzdW1lCisgICBldmVyeXRoaW5nIGlzIHBpbm5lZC4gKi8KK3N0YXRpYyB2b2lkIF9f aW5pdCB4ZW5fYWxsb2NfcHRlX2luaXQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxv bmcgcGZuKQoreworI2lmZGVmIENPTkZJR19GTEFUTUVNCisJQlVHX09OKG1lbV9tYXApOwkvKiBz aG91bGQgb25seSBiZSB1c2VkIGVhcmx5ICovCisjZW5kaWYKKwltYWtlX2xvd21lbV9wYWdlX3Jl YWRvbmx5KF9fdmEoUEZOX1BIWVMocGZuKSkpOworCXBpbl9wYWdldGFibGVfcGZuKE1NVUVYVF9Q SU5fTDFfVEFCTEUsIHBmbik7Cit9CisKKy8qIFVzZWQgZm9yIHBtZCBhbmQgcHVkICovCitzdGF0 aWMgdm9pZCBfX2luaXQgeGVuX2FsbG9jX3BtZF9pbml0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1 bnNpZ25lZCBsb25nIHBmbikKK3sKKyNpZmRlZiBDT05GSUdfRkxBVE1FTQorCUJVR19PTihtZW1f bWFwKTsJLyogc2hvdWxkIG9ubHkgYmUgdXNlZCBlYXJseSAqLworI2VuZGlmCisJbWFrZV9sb3dt ZW1fcGFnZV9yZWFkb25seShfX3ZhKFBGTl9QSFlTKHBmbikpKTsKK30KKworLyogRWFybHkgcmVs ZWFzZV9wdGUgYXNzdW1lcyB0aGF0IGFsbCBwdHMgYXJlIHBpbm5lZCwgc2luY2UgdGhlcmUncwor ICAgb25seSBpbml0X21tIGFuZCBhbnl0aGluZyBhdHRhY2hlZCB0byB0aGF0IGlzIHBpbm5lZC4g Ki8KK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5fcmVsZWFzZV9wdGVfaW5pdCh1bnNpZ25lZCBsb25n IHBmbikKK3sKKwlwaW5fcGFnZXRhYmxlX3BmbihNTVVFWFRfVU5QSU5fVEFCTEUsIHBmbik7CisJ bWFrZV9sb3dtZW1fcGFnZV9yZWFkd3JpdGUoX192YShQRk5fUEhZUyhwZm4pKSk7Cit9CisKK3N0 YXRpYyB2b2lkIF9faW5pdCB4ZW5fcmVsZWFzZV9wbWRfaW5pdCh1bnNpZ25lZCBsb25nIHBmbikK K3sKKwltYWtlX2xvd21lbV9wYWdlX3JlYWR3cml0ZShfX3ZhKFBGTl9QSFlTKHBmbikpKTsKK30K Kworc3RhdGljIGlubGluZSB2b2lkIF9fcGluX3BhZ2V0YWJsZV9wZm4odW5zaWduZWQgY21kLCB1 bnNpZ25lZCBsb25nIHBmbikKK3sKKwlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jczsKKwlzdHJ1 Y3QgbW11ZXh0X29wICpvcDsKKworCW1jcyA9IF9feGVuX21jX2VudHJ5KHNpemVvZigqb3ApKTsK KwlvcCA9IG1jcy5hcmdzOworCW9wLT5jbWQgPSBjbWQ7CisJb3AtPmFyZzEubWZuID0gcGZuX3Rv X21mbihwZm4pOworCisJTVVMVElfbW11ZXh0X29wKG1jcy5tYywgbWNzLmFyZ3MsIDEsIE5VTEws IERPTUlEX1NFTEYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19zZXRfcGZuX3Byb3QodW5z aWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCit7CisJc3RydWN0IG11bHRpY2FsbF9zcGFj ZSBtY3M7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpX192YShwZm4gPDwg UEFHRV9TSElGVCk7CisKKwltY3MgPSBfX3hlbl9tY19lbnRyeSgwKTsKKwlNVUxUSV91cGRhdGVf dmFfbWFwcGluZyhtY3MubWMsICh1bnNpZ25lZCBsb25nKWFkZHIsCisJCQkJcGZuX3B0ZShwZm4s IHByb3QpLCAwKTsKK30KKworLyogVGhpcyBuZWVkcyB0byBtYWtlIHN1cmUgdGhlIG5ldyBwdGUg cGFnZSBpcyBwaW5uZWQgaWZmIGl0cyBiZWluZworICAgYXR0YWNoZWQgdG8gYSBwaW5uZWQgcGFn ZXRhYmxlLiAqLworc3RhdGljIGlubGluZSB2b2lkIHhlbl9hbGxvY19wdHBhZ2Uoc3RydWN0IG1t X3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcGZuLAorCQkJCSAgICB1bnNpZ25lZCBsZXZlbCkK K3sKKwlib29sIHBpbm5lZCA9IFBhZ2VQaW5uZWQodmlydF90b19wYWdlKG1tLT5wZ2QpKTsKKwor CXRyYWNlX3hlbl9tbXVfYWxsb2NfcHRwYWdlKG1tLCBwZm4sIGxldmVsLCBwaW5uZWQpOworCisJ aWYgKHBpbm5lZCkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CisK KwkJU2V0UGFnZVBpbm5lZChwYWdlKTsKKworCQlpZiAoIVBhZ2VIaWdoTWVtKHBhZ2UpKSB7CisJ CQl4ZW5fbWNfYmF0Y2goKTsKKworCQkJX19zZXRfcGZuX3Byb3QocGZuLCBQQUdFX0tFUk5FTF9S Tyk7CisKKwkJCWlmIChsZXZlbCA9PSBQVF9QVEUgJiYgVVNFX1NQTElUX1BURV9QVExPQ0tTKQor CQkJCV9fcGluX3BhZ2V0YWJsZV9wZm4oTU1VRVhUX1BJTl9MMV9UQUJMRSwgcGZuKTsKKworCQkJ eGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfTU1VKTsKKwkJfSBlbHNlIHsKKwkJCS8qIG1ha2Ug c3VyZSB0aGVyZSBhcmUgbm8gc3RyYXkgbWFwcGluZ3Mgb2YKKwkJCSAgIHRoaXMgcGFnZSAqLwor CQkJa21hcF9mbHVzaF91bnVzZWQoKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgeGVuX2Fs bG9jX3B0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBwZm4pCit7CisJeGVu X2FsbG9jX3B0cGFnZShtbSwgcGZuLCBQVF9QVEUpOworfQorCitzdGF0aWMgdm9pZCB4ZW5fYWxs b2NfcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHBmbikKK3sKKwl4ZW5f YWxsb2NfcHRwYWdlKG1tLCBwZm4sIFBUX1BNRCk7Cit9CisKKy8qIFRoaXMgc2hvdWxkIG5ldmVy IGhhcHBlbiB1bnRpbCB3ZSdyZSBPSyB0byB1c2Ugc3RydWN0IHBhZ2UgKi8KK3N0YXRpYyBpbmxp bmUgdm9pZCB4ZW5fcmVsZWFzZV9wdHBhZ2UodW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxl dmVsKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKwlib29sIHBp bm5lZCA9IFBhZ2VQaW5uZWQocGFnZSk7CisKKwl0cmFjZV94ZW5fbW11X3JlbGVhc2VfcHRwYWdl KHBmbiwgbGV2ZWwsIHBpbm5lZCk7CisKKwlpZiAocGlubmVkKSB7CisJCWlmICghUGFnZUhpZ2hN ZW0ocGFnZSkpIHsKKwkJCXhlbl9tY19iYXRjaCgpOworCisJCQlpZiAobGV2ZWwgPT0gUFRfUFRF ICYmIFVTRV9TUExJVF9QVEVfUFRMT0NLUykKKwkJCQlfX3Bpbl9wYWdldGFibGVfcGZuKE1NVUVY VF9VTlBJTl9UQUJMRSwgcGZuKTsKKworCQkJX19zZXRfcGZuX3Byb3QocGZuLCBQQUdFX0tFUk5F TCk7CisKKwkJCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX01NVSk7CisJCX0KKwkJQ2xlYXJQ YWdlUGlubmVkKHBhZ2UpOworCX0KK30KKworc3RhdGljIHZvaWQgeGVuX3JlbGVhc2VfcHRlKHVu c2lnbmVkIGxvbmcgcGZuKQoreworCXhlbl9yZWxlYXNlX3B0cGFnZShwZm4sIFBUX1BURSk7Cit9 CisKK3N0YXRpYyB2b2lkIHhlbl9yZWxlYXNlX3BtZCh1bnNpZ25lZCBsb25nIHBmbikKK3sKKwl4 ZW5fcmVsZWFzZV9wdHBhZ2UocGZuLCBQVF9QTUQpOworfQorCisjaWYgQ09ORklHX1BHVEFCTEVf TEVWRUxTID09IDQKK3N0YXRpYyB2b2lkIHhlbl9hbGxvY19wdWQoc3RydWN0IG1tX3N0cnVjdCAq bW0sIHVuc2lnbmVkIGxvbmcgcGZuKQoreworCXhlbl9hbGxvY19wdHBhZ2UobW0sIHBmbiwgUFRf UFVEKTsKK30KKworc3RhdGljIHZvaWQgeGVuX3JlbGVhc2VfcHVkKHVuc2lnbmVkIGxvbmcgcGZu KQoreworCXhlbl9yZWxlYXNlX3B0cGFnZShwZm4sIFBUX1BVRCk7Cit9CisjZW5kaWYKKwordm9p ZCBfX2luaXQgeGVuX3Jlc2VydmVfdG9wKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1g4Nl8zMgor CXVuc2lnbmVkIGxvbmcgdG9wID0gSFlQRVJWSVNPUl9WSVJUX1NUQVJUOworCXN0cnVjdCB4ZW5f cGxhdGZvcm1fcGFyYW1ldGVycyBwcDsKKworCWlmIChIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhF TlZFUl9wbGF0Zm9ybV9wYXJhbWV0ZXJzLCAmcHApID09IDApCisJCXRvcCA9IHBwLnZpcnRfc3Rh cnQ7CisKKwlyZXNlcnZlX3RvcF9hZGRyZXNzKC10b3ApOworI2VuZGlmCS8qIENPTkZJR19YODZf MzIgKi8KK30KKworLyoKKyAqIExpa2UgX192YSgpLCBidXQgcmV0dXJucyBhZGRyZXNzIGluIHRo ZSBrZXJuZWwgbWFwcGluZyAod2hpY2ggaXMKKyAqIGFsbCB3ZSBoYXZlIHVudGlsIHRoZSBwaHlz aWNhbCBtZW1vcnkgbWFwcGluZyBoYXMgYmVlbiBzZXQgdXAuCisgKi8KK3N0YXRpYyB2b2lkICog X19pbml0IF9fa2EocGh5c19hZGRyX3QgcGFkZHIpCit7CisjaWZkZWYgQ09ORklHX1g4Nl82NAor CXJldHVybiAodm9pZCAqKShwYWRkciArIF9fU1RBUlRfS0VSTkVMX21hcCk7CisjZWxzZQorCXJl dHVybiBfX3ZhKHBhZGRyKTsKKyNlbmRpZgorfQorCisvKiBDb252ZXJ0IGEgbWFjaGluZSBhZGRy ZXNzIHRvIHBoeXNpY2FsIGFkZHJlc3MgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBt MnAocGh5c19hZGRyX3QgbWFkZHIpCit7CisJcGh5c19hZGRyX3QgcGFkZHI7CisKKwltYWRkciAm PSBQVEVfUEZOX01BU0s7CisJcGFkZHIgPSBtZm5fdG9fcGZuKG1hZGRyID4+IFBBR0VfU0hJRlQp IDw8IFBBR0VfU0hJRlQ7CisKKwlyZXR1cm4gcGFkZHI7Cit9CisKKy8qIENvbnZlcnQgYSBtYWNo aW5lIGFkZHJlc3MgdG8ga2VybmVsIHZpcnR1YWwgKi8KK3N0YXRpYyB2b2lkICogX19pbml0IG0y dihwaHlzX2FkZHJfdCBtYWRkcikKK3sKKwlyZXR1cm4gX19rYShtMnAobWFkZHIpKTsKK30KKwor LyogU2V0IHRoZSBwYWdlIHBlcm1pc3Npb25zIG9uIGFuIGlkZW50aXR5LW1hcHBlZCBwYWdlcyAq Lworc3RhdGljIHZvaWQgX19pbml0IHNldF9wYWdlX3Byb3RfZmxhZ3Modm9pZCAqYWRkciwgcGdw cm90X3QgcHJvdCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwl1bnNpZ25l ZCBsb25nIHBmbiA9IF9fcGEoYWRkcikgPj4gUEFHRV9TSElGVDsKKwlwdGVfdCBwdGUgPSBwZm5f cHRlKHBmbiwgcHJvdCk7CisKKwlpZiAoSFlQRVJWSVNPUl91cGRhdGVfdmFfbWFwcGluZygodW5z aWduZWQgbG9uZylhZGRyLCBwdGUsIGZsYWdzKSkKKwkJQlVHKCk7Cit9CitzdGF0aWMgdm9pZCBf X2luaXQgc2V0X3BhZ2VfcHJvdCh2b2lkICphZGRyLCBwZ3Byb3RfdCBwcm90KQoreworCXJldHVy biBzZXRfcGFnZV9wcm90X2ZsYWdzKGFkZHIsIHByb3QsIFVWTUZfTk9ORSk7Cit9CisjaWZkZWYg Q09ORklHX1g4Nl8zMgorc3RhdGljIHZvaWQgX19pbml0IHhlbl9tYXBfaWRlbnRpdHlfZWFybHko cG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBtYXhfcGZuKQoreworCXVuc2lnbmVkIHBtZGlkeCwg cHRlaWR4OworCXVuc2lnbmVkIGlkZW50X3B0ZTsKKwl1bnNpZ25lZCBsb25nIHBmbjsKKworCWxl dmVsMV9pZGVudF9wZ3QgPSBleHRlbmRfYnJrKHNpemVvZihwdGVfdCkgKiBMRVZFTDFfSURFTlRf RU5UUklFUywKKwkJCQkgICAgICBQQUdFX1NJWkUpOworCisJaWRlbnRfcHRlID0gMDsKKwlwZm4g PSAwOworCWZvciAocG1kaWR4ID0gMDsgcG1kaWR4IDwgUFRSU19QRVJfUE1EICYmIHBmbiA8IG1h eF9wZm47IHBtZGlkeCsrKSB7CisJCXB0ZV90ICpwdGVfcGFnZTsKKworCQkvKiBSZXVzZSBvciBh bGxvY2F0ZSBhIHBhZ2Ugb2YgcHRlcyAqLworCQlpZiAocG1kX3ByZXNlbnQocG1kW3BtZGlkeF0p KQorCQkJcHRlX3BhZ2UgPSBtMnYocG1kW3BtZGlkeF0ucG1kKTsKKwkJZWxzZSB7CisJCQkvKiBD aGVjayBmb3IgZnJlZSBwdGUgcGFnZXMgKi8KKwkJCWlmIChpZGVudF9wdGUgPT0gTEVWRUwxX0lE RU5UX0VOVFJJRVMpCisJCQkJYnJlYWs7CisKKwkJCXB0ZV9wYWdlID0gJmxldmVsMV9pZGVudF9w Z3RbaWRlbnRfcHRlXTsKKwkJCWlkZW50X3B0ZSArPSBQVFJTX1BFUl9QVEU7CisKKwkJCXBtZFtw bWRpZHhdID0gX19wbWQoX19wYShwdGVfcGFnZSkgfCBfUEFHRV9UQUJMRSk7CisJCX0KKworCQkv KiBJbnN0YWxsIG1hcHBpbmdzICovCisJCWZvciAocHRlaWR4ID0gMDsgcHRlaWR4IDwgUFRSU19Q RVJfUFRFOyBwdGVpZHgrKywgcGZuKyspIHsKKwkJCXB0ZV90IHB0ZTsKKworCQkJaWYgKHBmbiA+ IG1heF9wZm5fbWFwcGVkKQorCQkJCW1heF9wZm5fbWFwcGVkID0gcGZuOworCisJCQlpZiAoIXB0 ZV9ub25lKHB0ZV9wYWdlW3B0ZWlkeF0pKQorCQkJCWNvbnRpbnVlOworCisJCQlwdGUgPSBwZm5f cHRlKHBmbiwgUEFHRV9LRVJORUxfRVhFQyk7CisJCQlwdGVfcGFnZVtwdGVpZHhdID0gcHRlOwor CQl9CisJfQorCisJZm9yIChwdGVpZHggPSAwOyBwdGVpZHggPCBpZGVudF9wdGU7IHB0ZWlkeCAr PSBQVFJTX1BFUl9QVEUpCisJCXNldF9wYWdlX3Byb3QoJmxldmVsMV9pZGVudF9wZ3RbcHRlaWR4 XSwgUEFHRV9LRVJORUxfUk8pOworCisJc2V0X3BhZ2VfcHJvdChwbWQsIFBBR0VfS0VSTkVMX1JP KTsKK30KKyNlbmRpZgordm9pZCBfX2luaXQgeGVuX3NldHVwX21hY2hwaHlzX21hcHBpbmcodm9p ZCkKK3sKKwlzdHJ1Y3QgeGVuX21hY2hwaHlzX21hcHBpbmcgbWFwcGluZzsKKworCWlmIChIWVBF UlZJU09SX21lbW9yeV9vcChYRU5NRU1fbWFjaHBoeXNfbWFwcGluZywgJm1hcHBpbmcpID09IDAp IHsKKwkJbWFjaGluZV90b19waHlzX21hcHBpbmcgPSAodW5zaWduZWQgbG9uZyAqKW1hcHBpbmcu dl9zdGFydDsKKwkJbWFjaGluZV90b19waHlzX25yID0gbWFwcGluZy5tYXhfbWZuICsgMTsKKwl9 IGVsc2UgeworCQltYWNoaW5lX3RvX3BoeXNfbnIgPSBNQUNIMlBIWVNfTlJfRU5UUklFUzsKKwl9 CisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCVdBUk5fT04oKG1hY2hpbmVfdG9fcGh5c19tYXBwaW5n ICsgKG1hY2hpbmVfdG9fcGh5c19uciAtIDEpKQorCQk8IG1hY2hpbmVfdG9fcGh5c19tYXBwaW5n KTsKKyNlbmRpZgorfQorCisjaWZkZWYgQ09ORklHX1g4Nl82NAorc3RhdGljIHZvaWQgX19pbml0 IGNvbnZlcnRfcGZuX21mbih2b2lkICp2KQoreworCXB0ZV90ICpwdGUgPSB2OworCWludCBpOwor CisJLyogQWxsIGxldmVscyBhcmUgY29udmVydGVkIHRoZSBzYW1lIHdheSwgc28ganVzdCB0cmVh dCB0aGVtCisJICAgYXMgcHRlcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUFRSU19QRVJfUFRFOyBp KyspCisJCXB0ZVtpXSA9IHhlbl9tYWtlX3B0ZShwdGVbaV0ucHRlKTsKK30KK3N0YXRpYyB2b2lk IF9faW5pdCBjaGVja19wdF9iYXNlKHVuc2lnbmVkIGxvbmcgKnB0X2Jhc2UsIHVuc2lnbmVkIGxv bmcgKnB0X2VuZCwKKwkJCQkgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCWlmICgqcHRfYmFzZSA9 PSBQRk5fRE9XTihfX3BhKGFkZHIpKSkgeworCQlzZXRfcGFnZV9wcm90X2ZsYWdzKCh2b2lkICop YWRkciwgUEFHRV9LRVJORUwsIFVWTUZfSU5WTFBHKTsKKwkJY2xlYXJfcGFnZSgodm9pZCAqKWFk ZHIpOworCQkoKnB0X2Jhc2UpKys7CisJfQorCWlmICgqcHRfZW5kID09IFBGTl9ET1dOKF9fcGEo YWRkcikpKSB7CisJCXNldF9wYWdlX3Byb3RfZmxhZ3MoKHZvaWQgKilhZGRyLCBQQUdFX0tFUk5F TCwgVVZNRl9JTlZMUEcpOworCQljbGVhcl9wYWdlKCh2b2lkICopYWRkcik7CisJCSgqcHRfZW5k KS0tOworCX0KK30KKy8qCisgKiBTZXQgdXAgdGhlIGluaXRpYWwga2VybmVsIHBhZ2V0YWJsZS4K KyAqCisgKiBXZSBjYW4gY29uc3RydWN0IHRoaXMgYnkgZ3JhZnRpbmcgdGhlIFhlbiBwcm92aWRl ZCBwYWdldGFibGUgaW50bworICogaGVhZF82NC5TJ3MgcHJlY29uc3RydWN0ZWQgcGFnZXRhYmxl cy4gIFdlIGNvcHkgdGhlIFhlbiBMMidzIGludG8KKyAqIGxldmVsMl9pZGVudF9wZ3QsIGFuZCBs ZXZlbDJfa2VybmVsX3BndC4gIFRoaXMgbWVhbnMgdGhhdCBvbmx5IHRoZQorICoga2VybmVsIGhh cyBhIHBoeXNpY2FsIG1hcHBpbmcgdG8gc3RhcnQgd2l0aCAtIGJ1dCB0aGF0J3MgZW5vdWdoIHRv CisgKiBnZXQgX192YSB3b3JraW5nLiAgV2UgbmVlZCB0byBmaWxsIGluIHRoZSByZXN0IG9mIHRo ZSBwaHlzaWNhbAorICogbWFwcGluZyBvbmNlIHNvbWUgc29ydCBvZiBhbGxvY2F0b3IgaGFzIGJl ZW4gc2V0IHVwLgorICovCit2b2lkIF9faW5pdCB4ZW5fc2V0dXBfa2VybmVsX3BhZ2V0YWJsZShw Z2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIG1heF9wZm4pCit7CisJcHVkX3QgKmwzOworCXBtZF90 ICpsMjsKKwl1bnNpZ25lZCBsb25nIGFkZHJbM107CisJdW5zaWduZWQgbG9uZyBwdF9iYXNlLCBw dF9lbmQ7CisJdW5zaWduZWQgaTsKKworCS8qIG1heF9wZm5fbWFwcGVkIGlzIHRoZSBsYXN0IHBm biBtYXBwZWQgaW4gdGhlIGluaXRpYWwgbWVtb3J5CisJICogbWFwcGluZ3MuIENvbnNpZGVyaW5n IHRoYXQgb24gWGVuIGFmdGVyIHRoZSBrZXJuZWwgbWFwcGluZ3Mgd2UKKwkgKiBoYXZlIHRoZSBt YXBwaW5ncyBvZiBzb21lIHBhZ2VzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gcGZuIHNwYWNlLCB3ZQor CSAqIHNldCBtYXhfcGZuX21hcHBlZCB0byB0aGUgbGFzdCByZWFsIHBmbiBtYXBwZWQuICovCisJ aWYgKHhlbl9zdGFydF9pbmZvLT5tZm5fbGlzdCA8IF9fU1RBUlRfS0VSTkVMX21hcCkKKwkJbWF4 X3Bmbl9tYXBwZWQgPSB4ZW5fc3RhcnRfaW5mby0+Zmlyc3RfcDJtX3BmbjsKKwllbHNlCisJCW1h eF9wZm5fbWFwcGVkID0gUEZOX0RPV04oX19wYSh4ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3QpKTsK KworCXB0X2Jhc2UgPSBQRk5fRE9XTihfX3BhKHhlbl9zdGFydF9pbmZvLT5wdF9iYXNlKSk7CisJ cHRfZW5kID0gcHRfYmFzZSArIHhlbl9zdGFydF9pbmZvLT5ucl9wdF9mcmFtZXM7CisKKwkvKiBa YXAgaWRlbnRpdHkgbWFwcGluZyAqLworCWluaXRfbGV2ZWw0X3BndFswXSA9IF9fcGdkKDApOwor CisJaWYgKCF4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSkgewor CQkvKiBQcmUtY29uc3RydWN0ZWQgZW50cmllcyBhcmUgaW4gcGZuLCBzbyBjb252ZXJ0IHRvIG1m biAqLworCQkvKiBMNFsyNzJdIC0+IGxldmVsM19pZGVudF9wZ3QKKwkJICogTDRbNTExXSAtPiBs ZXZlbDNfa2VybmVsX3BndCAqLworCQljb252ZXJ0X3Bmbl9tZm4oaW5pdF9sZXZlbDRfcGd0KTsK KworCQkvKiBMM19pWzBdIC0+IGxldmVsMl9pZGVudF9wZ3QgKi8KKwkJY29udmVydF9wZm5fbWZu KGxldmVsM19pZGVudF9wZ3QpOworCQkvKiBMM19rWzUxMF0gLT4gbGV2ZWwyX2tlcm5lbF9wZ3QK KwkJICogTDNfa1s1MTFdIC0+IGxldmVsMl9maXhtYXBfcGd0ICovCisJCWNvbnZlcnRfcGZuX21m bihsZXZlbDNfa2VybmVsX3BndCk7CisKKwkJLyogTDNfa1s1MTFdWzUwNl0gLT4gbGV2ZWwxX2Zp eG1hcF9wZ3QgKi8KKwkJY29udmVydF9wZm5fbWZuKGxldmVsMl9maXhtYXBfcGd0KTsKKwl9CisJ LyogV2UgZ2V0IFs1MTFdWzUxMV0gYW5kIGhhdmUgWGVuJ3MgdmVyc2lvbiBvZiBsZXZlbDJfa2Vy bmVsX3BndCAqLworCWwzID0gbTJ2KHBnZFtwZ2RfaW5kZXgoX19TVEFSVF9LRVJORUxfbWFwKV0u cGdkKTsKKwlsMiA9IG0ydihsM1twdWRfaW5kZXgoX19TVEFSVF9LRVJORUxfbWFwKV0ucHVkKTsK KworCWFkZHJbMF0gPSAodW5zaWduZWQgbG9uZylwZ2Q7CisJYWRkclsxXSA9ICh1bnNpZ25lZCBs b25nKWwzOworCWFkZHJbMl0gPSAodW5zaWduZWQgbG9uZylsMjsKKwkvKiBHcmFmdCBpdCBvbnRv IEw0WzI3Ml1bMF0uIE5vdGUgdGhhdCB3ZSBjcmVhdGluZyBhbiBhbGlhc2luZyBwcm9ibGVtOgor CSAqIEJvdGggTDRbMjcyXVswXSBhbmQgTDRbNTExXVs1MTBdIGhhdmUgZW50cmllcyB0aGF0IHBv aW50IHRvIHRoZSBzYW1lCisJICogTDIgKFBNRCkgdGFibGVzLiBNZWFuaW5nIHRoYXQgaWYgeW91 IG1vZGlmeSBpdCBpbiBfX3ZhIHNwYWNlCisJICogaXQgd2lsbCBiZSBhbHNvIG1vZGlmaWVkIGlu IHRoZSBfX2thIHNwYWNlISAoQnV0IGlmIHlvdSBqdXN0CisJICogbW9kaWZ5IHRoZSBQTUQgdGFi bGUgdG8gcG9pbnQgdG8gb3RoZXIgUFRFJ3Mgb3Igbm9uZSwgdGhlbiB5b3UKKwkgKiBhcmUgT0sg LSB3aGljaCBpcyB3aGF0IGNsZWFudXBfaGlnaG1hcCBkb2VzKSAqLworCWNvcHlfcGFnZShsZXZl bDJfaWRlbnRfcGd0LCBsMik7CisJLyogR3JhZnQgaXQgb250byBMNFs1MTFdWzUxMF0gKi8KKwlj b3B5X3BhZ2UobGV2ZWwyX2tlcm5lbF9wZ3QsIGwyKTsKKworCS8qIENvcHkgdGhlIGluaXRpYWwg UC0+TSB0YWJsZSBtYXBwaW5ncyBpZiBuZWNlc3NhcnkuICovCisJaSA9IHBnZF9pbmRleCh4ZW5f c3RhcnRfaW5mby0+bWZuX2xpc3QpOworCWlmIChpICYmIGkgPCBwZ2RfaW5kZXgoX19TVEFSVF9L RVJORUxfbWFwKSkKKwkJaW5pdF9sZXZlbDRfcGd0W2ldID0gKChwZ2RfdCAqKXhlbl9zdGFydF9p bmZvLT5wdF9iYXNlKVtpXTsKKworCWlmICgheGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3RyYW5z bGF0ZWRfcGh5c21hcCkpIHsKKwkJLyogTWFrZSBwYWdldGFibGUgcGllY2VzIFJPICovCisJCXNl dF9wYWdlX3Byb3QoaW5pdF9sZXZlbDRfcGd0LCBQQUdFX0tFUk5FTF9STyk7CisJCXNldF9wYWdl X3Byb3QobGV2ZWwzX2lkZW50X3BndCwgUEFHRV9LRVJORUxfUk8pOworCQlzZXRfcGFnZV9wcm90 KGxldmVsM19rZXJuZWxfcGd0LCBQQUdFX0tFUk5FTF9STyk7CisJCXNldF9wYWdlX3Byb3QobGV2 ZWwzX3VzZXJfdnN5c2NhbGwsIFBBR0VfS0VSTkVMX1JPKTsKKwkJc2V0X3BhZ2VfcHJvdChsZXZl bDJfaWRlbnRfcGd0LCBQQUdFX0tFUk5FTF9STyk7CisJCXNldF9wYWdlX3Byb3QobGV2ZWwyX2tl cm5lbF9wZ3QsIFBBR0VfS0VSTkVMX1JPKTsKKwkJc2V0X3BhZ2VfcHJvdChsZXZlbDJfZml4bWFw X3BndCwgUEFHRV9LRVJORUxfUk8pOworCQlzZXRfcGFnZV9wcm90KGxldmVsMV9maXhtYXBfcGd0 LCBQQUdFX0tFUk5FTF9STyk7CisKKwkJLyogUGluIGRvd24gbmV3IEw0ICovCisJCXBpbl9wYWdl dGFibGVfcGZuKE1NVUVYVF9QSU5fTDRfVEFCTEUsCisJCQkJICBQRk5fRE9XTihfX3BhX3N5bWJv bChpbml0X2xldmVsNF9wZ3QpKSk7CisKKwkJLyogVW5waW4gWGVuLXByb3ZpZGVkIG9uZSAqLwor CQlwaW5fcGFnZXRhYmxlX3BmbihNTVVFWFRfVU5QSU5fVEFCTEUsIFBGTl9ET1dOKF9fcGEocGdk KSkpOworCisJCS8qCisJCSAqIEF0IHRoaXMgc3RhZ2UgdGhlcmUgY2FuIGJlIG5vIHVzZXIgcGdk LCBhbmQgbm8gcGFnZQorCQkgKiBzdHJ1Y3R1cmUgdG8gYXR0YWNoIGl0IHRvLCBzbyBtYWtlIHN1 cmUgd2UganVzdCBzZXQga2VybmVsCisJCSAqIHBnZC4KKwkJICovCisJCXhlbl9tY19iYXRjaCgp OworCQlfX3hlbl93cml0ZV9jcjModHJ1ZSwgX19wYShpbml0X2xldmVsNF9wZ3QpKTsKKwkJeGVu X21jX2lzc3VlKFBBUkFWSVJUX0xBWllfQ1BVKTsKKwl9IGVsc2UKKwkJbmF0aXZlX3dyaXRlX2Ny MyhfX3BhKGluaXRfbGV2ZWw0X3BndCkpOworCisJLyogV2UgY2FuJ3QgdGhhdCBlYXNpbHkgcmlw IG91dCBMMyBhbmQgTDIsIGFzIHRoZSBYZW4gcGFnZXRhYmxlcyBhcmUKKwkgKiBzZXQgb3V0IHRo aXMgd2F5OiBbTDRdLCBbTDFdLCBbTDJdLCBbTDNdLCBbTDFdLCBbTDFdIC4uLiAgZm9yCisJICog dGhlIGluaXRpYWwgZG9tYWluLiBGb3IgZ3Vlc3RzIHVzaW5nIHRoZSB0b29sc3RhY2ssIHRoZXkg YXJlIGluOgorCSAqIFtMNF0sIFtMM10sIFtMMl0sIFtMMV0sIFtMMV0sIG9yZGVyIC4uIFNvIGZv ciBkb20wIHdlIGNhbiBvbmx5CisJICogcmlwIG91dCB0aGUgW0w0XSAocGdkKSwgYnV0IGZvciBn dWVzdHMgd2Ugc2hhdmUgb2ZmIHRocmVlIHBhZ2VzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBB UlJBWV9TSVpFKGFkZHIpOyBpKyspCisJCWNoZWNrX3B0X2Jhc2UoJnB0X2Jhc2UsICZwdF9lbmQs IGFkZHJbaV0pOworCisJLyogT3VyIChieSB0aHJlZSBwYWdlcykgc21hbGxlciBYZW4gcGFnZXRh YmxlIHRoYXQgd2UgYXJlIHVzaW5nICovCisJeGVuX3B0X2Jhc2UgPSBQRk5fUEhZUyhwdF9iYXNl KTsKKwl4ZW5fcHRfc2l6ZSA9IChwdF9lbmQgLSBwdF9iYXNlKSAqIFBBR0VfU0laRTsKKwltZW1i bG9ja19yZXNlcnZlKHhlbl9wdF9iYXNlLCB4ZW5fcHRfc2l6ZSk7CisKKwkvKiBSZXZlY3RvciB0 aGUgeGVuX3N0YXJ0X2luZm8gKi8KKwl4ZW5fc3RhcnRfaW5mbyA9IChzdHJ1Y3Qgc3RhcnRfaW5m byAqKV9fdmEoX19wYSh4ZW5fc3RhcnRfaW5mbykpOworfQorCisvKgorICogUmVhZCBhIHZhbHVl IGZyb20gYSBwaHlzaWNhbCBhZGRyZXNzLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2lu aXQgeGVuX3JlYWRfcGh5c191bG9uZyhwaHlzX2FkZHJfdCBhZGRyKQoreworCXVuc2lnbmVkIGxv bmcgKnZhZGRyOworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJdmFkZHIgPSBlYXJseV9tZW1yZW1h cF9ybyhhZGRyLCBzaXplb2YodmFsKSk7CisJdmFsID0gKnZhZGRyOworCWVhcmx5X21lbXVubWFw KHZhZGRyLCBzaXplb2YodmFsKSk7CisJcmV0dXJuIHZhbDsKK30KKworLyoKKyAqIFRyYW5zbGF0 ZSBhIHZpcnR1YWwgYWRkcmVzcyB0byBhIHBoeXNpY2FsIG9uZSB3aXRob3V0IHJlbHlpbmcgb24g bWFwcGVkCisgKiBwYWdlIHRhYmxlcy4KKyAqLworc3RhdGljIHBoeXNfYWRkcl90IF9faW5pdCB4 ZW5fZWFybHlfdmlydF90b19waHlzKHVuc2lnbmVkIGxvbmcgdmFkZHIpCit7CisJcGh5c19hZGRy X3QgcGE7CisJcGdkX3QgcGdkOworCXB1ZF90IHB1ZDsKKwlwbWRfdCBwbWQ7CisJcHRlX3QgcHRl OworCisJcGEgPSByZWFkX2NyMygpOworCXBnZCA9IG5hdGl2ZV9tYWtlX3BnZCh4ZW5fcmVhZF9w aHlzX3Vsb25nKHBhICsgcGdkX2luZGV4KHZhZGRyKSAqCisJCQkJCQkgICAgICAgc2l6ZW9mKHBn ZCkpKTsKKwlpZiAoIXBnZF9wcmVzZW50KHBnZCkpCisJCXJldHVybiAwOworCisJcGEgPSBwZ2Rf dmFsKHBnZCkgJiBQVEVfUEZOX01BU0s7CisJcHVkID0gbmF0aXZlX21ha2VfcHVkKHhlbl9yZWFk X3BoeXNfdWxvbmcocGEgKyBwdWRfaW5kZXgodmFkZHIpICoKKwkJCQkJCSAgICAgICBzaXplb2Yo cHVkKSkpOworCWlmICghcHVkX3ByZXNlbnQocHVkKSkKKwkJcmV0dXJuIDA7CisJcGEgPSBwdWRf cGZuKHB1ZCkgPDwgUEFHRV9TSElGVDsKKwlpZiAocHVkX2xhcmdlKHB1ZCkpCisJCXJldHVybiBw YSArICh2YWRkciAmIH5QVURfTUFTSyk7CisKKwlwbWQgPSBuYXRpdmVfbWFrZV9wbWQoeGVuX3Jl YWRfcGh5c191bG9uZyhwYSArIHBtZF9pbmRleCh2YWRkcikgKgorCQkJCQkJICAgICAgIHNpemVv ZihwbWQpKSk7CisJaWYgKCFwbWRfcHJlc2VudChwbWQpKQorCQlyZXR1cm4gMDsKKwlwYSA9IHBt ZF9wZm4ocG1kKSA8PCBQQUdFX1NISUZUOworCWlmIChwbWRfbGFyZ2UocG1kKSkKKwkJcmV0dXJu IHBhICsgKHZhZGRyICYgflBNRF9NQVNLKTsKKworCXB0ZSA9IG5hdGl2ZV9tYWtlX3B0ZSh4ZW5f cmVhZF9waHlzX3Vsb25nKHBhICsgcHRlX2luZGV4KHZhZGRyKSAqCisJCQkJCQkgICAgICAgc2l6 ZW9mKHB0ZSkpKTsKKwlpZiAoIXB0ZV9wcmVzZW50KHB0ZSkpCisJCXJldHVybiAwOworCXBhID0g cHRlX3BmbihwdGUpIDw8IFBBR0VfU0hJRlQ7CisKKwlyZXR1cm4gcGEgfCAodmFkZHIgJiB+UEFH RV9NQVNLKTsKK30KKworLyoKKyAqIEZpbmQgYSBuZXcgYXJlYSBmb3IgdGhlIGh5cGVydmlzb3Ig c3VwcGxpZWQgcDJtIGxpc3QgYW5kIHJlbG9jYXRlIHRoZSBwMm0gdG8KKyAqIHRoaXMgYXJlYS4K KyAqLwordm9pZCBfX2luaXQgeGVuX3JlbG9jYXRlX3AybSh2b2lkKQoreworCXBoeXNfYWRkcl90 IHNpemUsIG5ld19hcmVhLCBwdF9waHlzLCBwbWRfcGh5cywgcHVkX3BoeXM7CisJdW5zaWduZWQg bG9uZyBwMm1fcGZuLCBwMm1fcGZuX2VuZCwgbl9mcmFtZXMsIHBmbiwgcGZuX2VuZDsKKwlpbnQg bl9wdGUsIG5fcHQsIG5fcG1kLCBuX3B1ZCwgaWR4X3B0ZSwgaWR4X3B0LCBpZHhfcG1kLCBpZHhf cHVkOworCXB0ZV90ICpwdDsKKwlwbWRfdCAqcG1kOworCXB1ZF90ICpwdWQ7CisJcGdkX3QgKnBn ZDsKKwl1bnNpZ25lZCBsb25nICpuZXdfcDJtOworCisJc2l6ZSA9IFBBR0VfQUxJR04oeGVuX3N0 YXJ0X2luZm8tPm5yX3BhZ2VzICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwluX3B0ZSA9IHJv dW5kdXAoc2l6ZSwgUEFHRV9TSVpFKSA+PiBQQUdFX1NISUZUOworCW5fcHQgPSByb3VuZHVwKHNp emUsIFBNRF9TSVpFKSA+PiBQTURfU0hJRlQ7CisJbl9wbWQgPSByb3VuZHVwKHNpemUsIFBVRF9T SVpFKSA+PiBQVURfU0hJRlQ7CisJbl9wdWQgPSByb3VuZHVwKHNpemUsIFBHRElSX1NJWkUpID4+ IFBHRElSX1NISUZUOworCW5fZnJhbWVzID0gbl9wdGUgKyBuX3B0ICsgbl9wbWQgKyBuX3B1ZDsK KworCW5ld19hcmVhID0geGVuX2ZpbmRfZnJlZV9hcmVhKFBGTl9QSFlTKG5fZnJhbWVzKSk7CisJ aWYgKCFuZXdfYXJlYSkgeworCQl4ZW5fcmF3X2NvbnNvbGVfd3JpdGUoIkNhbid0IGZpbmQgbmV3 IG1lbW9yeSBhcmVhIGZvciBwMm0gbmVlZGVkIGR1ZSB0byBFODIwIG1hcCBjb25mbGljdFxuIik7 CisJCUJVRygpOworCX0KKworCS8qCisJICogU2V0dXAgdGhlIHBhZ2UgdGFibGVzIGZvciBhZGRy ZXNzaW5nIHRoZSBuZXcgcDJtIGxpc3QuCisJICogV2UgaGF2ZSBhc2tlZCB0aGUgaHlwZXJ2aXNv ciB0byBtYXAgdGhlIHAybSBsaXN0IGF0IHRoZSB1c2VyIGFkZHJlc3MKKwkgKiBQVURfU0laRS4g SXQgbWF5IGhhdmUgZG9uZSBzbywgb3IgaXQgbWF5IGhhdmUgdXNlZCBhIGtlcm5lbCBzcGFjZQor CSAqIGFkZHJlc3MgZGVwZW5kaW5nIG9uIHRoZSBYZW4gdmVyc2lvbi4KKwkgKiBUbyBhdm9pZCBh bnkgcG9zc2libGUgdmlydHVhbCBhZGRyZXNzIGNvbGxpc2lvbiwganVzdCB1c2UKKwkgKiAyICog UFVEX1NJWkUgZm9yIHRoZSBuZXcgYXJlYS4KKwkgKi8KKwlwdWRfcGh5cyA9IG5ld19hcmVhOwor CXBtZF9waHlzID0gcHVkX3BoeXMgKyBQRk5fUEhZUyhuX3B1ZCk7CisJcHRfcGh5cyA9IHBtZF9w aHlzICsgUEZOX1BIWVMobl9wbWQpOworCXAybV9wZm4gPSBQRk5fRE9XTihwdF9waHlzKSArIG5f cHQ7CisKKwlwZ2QgPSBfX3ZhKHJlYWRfY3IzKCkpOworCW5ld19wMm0gPSAodW5zaWduZWQgbG9u ZyAqKSgyICogUEdESVJfU0laRSk7CisJZm9yIChpZHhfcHVkID0gMDsgaWR4X3B1ZCA8IG5fcHVk OyBpZHhfcHVkKyspIHsKKwkJcHVkID0gZWFybHlfbWVtcmVtYXAocHVkX3BoeXMsIFBBR0VfU0la RSk7CisJCWNsZWFyX3BhZ2UocHVkKTsKKwkJZm9yIChpZHhfcG1kID0gMDsgaWR4X3BtZCA8IG1p bihuX3BtZCwgUFRSU19QRVJfUFVEKTsKKwkJICAgICBpZHhfcG1kKyspIHsKKwkJCXBtZCA9IGVh cmx5X21lbXJlbWFwKHBtZF9waHlzLCBQQUdFX1NJWkUpOworCQkJY2xlYXJfcGFnZShwbWQpOwor CQkJZm9yIChpZHhfcHQgPSAwOyBpZHhfcHQgPCBtaW4obl9wdCwgUFRSU19QRVJfUE1EKTsKKwkJ CSAgICAgaWR4X3B0KyspIHsKKwkJCQlwdCA9IGVhcmx5X21lbXJlbWFwKHB0X3BoeXMsIFBBR0Vf U0laRSk7CisJCQkJY2xlYXJfcGFnZShwdCk7CisJCQkJZm9yIChpZHhfcHRlID0gMDsKKwkJCQkg ICAgIGlkeF9wdGUgPCBtaW4obl9wdGUsIFBUUlNfUEVSX1BURSk7CisJCQkJICAgICBpZHhfcHRl KyspIHsKKwkJCQkJc2V0X3B0ZShwdCArIGlkeF9wdGUsCisJCQkJCQlwZm5fcHRlKHAybV9wZm4s IFBBR0VfS0VSTkVMKSk7CisJCQkJCXAybV9wZm4rKzsKKwkJCQl9CisJCQkJbl9wdGUgLT0gUFRS U19QRVJfUFRFOworCQkJCWVhcmx5X21lbXVubWFwKHB0LCBQQUdFX1NJWkUpOworCQkJCW1ha2Vf bG93bWVtX3BhZ2VfcmVhZG9ubHkoX192YShwdF9waHlzKSk7CisJCQkJcGluX3BhZ2V0YWJsZV9w Zm4oTU1VRVhUX1BJTl9MMV9UQUJMRSwKKwkJCQkJCSAgUEZOX0RPV04ocHRfcGh5cykpOworCQkJ CXNldF9wbWQocG1kICsgaWR4X3B0LAorCQkJCQlfX3BtZChfUEFHRV9UQUJMRSB8IHB0X3BoeXMp KTsKKwkJCQlwdF9waHlzICs9IFBBR0VfU0laRTsKKwkJCX0KKwkJCW5fcHQgLT0gUFRSU19QRVJf UE1EOworCQkJZWFybHlfbWVtdW5tYXAocG1kLCBQQUdFX1NJWkUpOworCQkJbWFrZV9sb3dtZW1f cGFnZV9yZWFkb25seShfX3ZhKHBtZF9waHlzKSk7CisJCQlwaW5fcGFnZXRhYmxlX3BmbihNTVVF WFRfUElOX0wyX1RBQkxFLAorCQkJCQkgIFBGTl9ET1dOKHBtZF9waHlzKSk7CisJCQlzZXRfcHVk KHB1ZCArIGlkeF9wbWQsIF9fcHVkKF9QQUdFX1RBQkxFIHwgcG1kX3BoeXMpKTsKKwkJCXBtZF9w aHlzICs9IFBBR0VfU0laRTsKKwkJfQorCQluX3BtZCAtPSBQVFJTX1BFUl9QVUQ7CisJCWVhcmx5 X21lbXVubWFwKHB1ZCwgUEFHRV9TSVpFKTsKKwkJbWFrZV9sb3dtZW1fcGFnZV9yZWFkb25seShf X3ZhKHB1ZF9waHlzKSk7CisJCXBpbl9wYWdldGFibGVfcGZuKE1NVUVYVF9QSU5fTDNfVEFCTEUs IFBGTl9ET1dOKHB1ZF9waHlzKSk7CisJCXNldF9wZ2QocGdkICsgMiArIGlkeF9wdWQsIF9fcGdk KF9QQUdFX1RBQkxFIHwgcHVkX3BoeXMpKTsKKwkJcHVkX3BoeXMgKz0gUEFHRV9TSVpFOworCX0K KworCS8qIE5vdyBjb3B5IHRoZSBvbGQgcDJtIGluZm8gdG8gdGhlIG5ldyBhcmVhLiAqLworCW1l bWNweShuZXdfcDJtLCB4ZW5fcDJtX2FkZHIsIHNpemUpOworCXhlbl9wMm1fYWRkciA9IG5ld19w Mm07CisKKwkvKiBSZWxlYXNlIHRoZSBvbGQgcDJtIGxpc3QgYW5kIHNldCBuZXcgbGlzdCBpbmZv LiAqLworCXAybV9wZm4gPSBQRk5fRE9XTih4ZW5fZWFybHlfdmlydF90b19waHlzKHhlbl9zdGFy dF9pbmZvLT5tZm5fbGlzdCkpOworCUJVR19PTighcDJtX3Bmbik7CisJcDJtX3Bmbl9lbmQgPSBw Mm1fcGZuICsgUEZOX0RPV04oc2l6ZSk7CisKKwlpZiAoeGVuX3N0YXJ0X2luZm8tPm1mbl9saXN0 IDwgX19TVEFSVF9LRVJORUxfbWFwKSB7CisJCXBmbiA9IHhlbl9zdGFydF9pbmZvLT5maXJzdF9w Mm1fcGZuOworCQlwZm5fZW5kID0geGVuX3N0YXJ0X2luZm8tPmZpcnN0X3AybV9wZm4gKworCQkJ ICB4ZW5fc3RhcnRfaW5mby0+bnJfcDJtX2ZyYW1lczsKKwkJc2V0X3BnZChwZ2QgKyAxLCBfX3Bn ZCgwKSk7CisJfSBlbHNlIHsKKwkJcGZuID0gcDJtX3BmbjsKKwkJcGZuX2VuZCA9IHAybV9wZm5f ZW5kOworCX0KKworCW1lbWJsb2NrX2ZyZWUoUEZOX1BIWVMocGZuKSwgUEFHRV9TSVpFICogKHBm bl9lbmQgLSBwZm4pKTsKKwl3aGlsZSAocGZuIDwgcGZuX2VuZCkgeworCQlpZiAocGZuID09IHAy bV9wZm4pIHsKKwkJCXBmbiA9IHAybV9wZm5fZW5kOworCQkJY29udGludWU7CisJCX0KKwkJbWFr ZV9sb3dtZW1fcGFnZV9yZWFkd3JpdGUoX192YShQRk5fUEhZUyhwZm4pKSk7CisJCXBmbisrOwor CX0KKworCXhlbl9zdGFydF9pbmZvLT5tZm5fbGlzdCA9ICh1bnNpZ25lZCBsb25nKXhlbl9wMm1f YWRkcjsKKwl4ZW5fc3RhcnRfaW5mby0+Zmlyc3RfcDJtX3BmbiA9ICBQRk5fRE9XTihuZXdfYXJl YSk7CisJeGVuX3N0YXJ0X2luZm8tPm5yX3AybV9mcmFtZXMgPSBuX2ZyYW1lczsKK30KKworI2Vs c2UJLyogIUNPTkZJR19YODZfNjQgKi8KK3N0YXRpYyBSRVNFUlZFX0JSS19BUlJBWShwbWRfdCwg aW5pdGlhbF9rZXJuZWxfcG1kLCBQVFJTX1BFUl9QTUQpOworc3RhdGljIFJFU0VSVkVfQlJLX0FS UkFZKHBtZF90LCBzd2FwcGVyX2tlcm5lbF9wbWQsIFBUUlNfUEVSX1BNRCk7CisKK3N0YXRpYyB2 b2lkIF9faW5pdCB4ZW5fd3JpdGVfY3IzX2luaXQodW5zaWduZWQgbG9uZyBjcjMpCit7CisJdW5z aWduZWQgbG9uZyBwZm4gPSBQRk5fRE9XTihfX3BhKHN3YXBwZXJfcGdfZGlyKSk7CisKKwlCVUdf T04ocmVhZF9jcjMoKSAhPSBfX3BhKGluaXRpYWxfcGFnZV90YWJsZSkpOworCUJVR19PTihjcjMg IT0gX19wYShzd2FwcGVyX3BnX2RpcikpOworCisJLyoKKwkgKiBXZSBhcmUgc3dpdGNoaW5nIHRv IHN3YXBwZXJfcGdfZGlyIGZvciB0aGUgZmlyc3QgdGltZSAoZnJvbQorCSAqIGluaXRpYWxfcGFn ZV90YWJsZSkgYW5kIHRoZXJlZm9yZSBuZWVkIHRvIG1hcmsgdGhhdCBwYWdlCisJICogcmVhZC1v bmx5IGFuZCB0aGVuIHBpbiBpdC4KKwkgKgorCSAqIFhlbiBkaXNhbGxvd3Mgc2hhcmluZyBvZiBr ZXJuZWwgUE1EcyBmb3IgUEFFCisJICogZ3Vlc3RzLiBUaGVyZWZvcmUgd2UgbXVzdCBjb3B5IHRo ZSBrZXJuZWwgUE1EIGZyb20KKwkgKiBpbml0aWFsX3BhZ2VfdGFibGUgaW50byBhIG5ldyBrZXJu ZWwgUE1EIHRvIGJlIHVzZWQgaW4KKwkgKiBzd2FwcGVyX3BnX2Rpci4KKwkgKi8KKwlzd2FwcGVy X2tlcm5lbF9wbWQgPQorCQlleHRlbmRfYnJrKHNpemVvZihwbWRfdCkgKiBQVFJTX1BFUl9QTUQs IFBBR0VfU0laRSk7CisJY29weV9wYWdlKHN3YXBwZXJfa2VybmVsX3BtZCwgaW5pdGlhbF9rZXJu ZWxfcG1kKTsKKwlzd2FwcGVyX3BnX2RpcltLRVJORUxfUEdEX0JPVU5EQVJZXSA9CisJCV9fcGdk KF9fcGEoc3dhcHBlcl9rZXJuZWxfcG1kKSB8IF9QQUdFX1BSRVNFTlQpOworCXNldF9wYWdlX3By b3Qoc3dhcHBlcl9rZXJuZWxfcG1kLCBQQUdFX0tFUk5FTF9STyk7CisKKwlzZXRfcGFnZV9wcm90 KHN3YXBwZXJfcGdfZGlyLCBQQUdFX0tFUk5FTF9STyk7CisJeGVuX3dyaXRlX2NyMyhjcjMpOwor CXBpbl9wYWdldGFibGVfcGZuKE1NVUVYVF9QSU5fTDNfVEFCTEUsIHBmbik7CisKKwlwaW5fcGFn ZXRhYmxlX3BmbihNTVVFWFRfVU5QSU5fVEFCTEUsCisJCQkgIFBGTl9ET1dOKF9fcGEoaW5pdGlh bF9wYWdlX3RhYmxlKSkpOworCXNldF9wYWdlX3Byb3QoaW5pdGlhbF9wYWdlX3RhYmxlLCBQQUdF X0tFUk5FTCk7CisJc2V0X3BhZ2VfcHJvdChpbml0aWFsX2tlcm5lbF9wbWQsIFBBR0VfS0VSTkVM KTsKKworCXB2X21tdV9vcHMud3JpdGVfY3IzID0gJnhlbl93cml0ZV9jcjM7Cit9CisKKy8qCisg KiBGb3IgMzIgYml0IGRvbWFpbnMgeGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2UgaXMgdGhlIHBnZCBh ZGRyZXNzIHdoaWNoIG1pZ2h0IGJlCisgKiBub3QgdGhlIGZpcnN0IHBhZ2UgdGFibGUgaW4gdGhl IHBhZ2UgdGFibGUgcG9vbC4KKyAqIEl0ZXJhdGUgdGhyb3VnaCB0aGUgaW5pdGlhbCBwYWdlIHRh YmxlcyB0byBmaW5kIHRoZSByZWFsIHBhZ2UgdGFibGUgYmFzZS4KKyAqLworc3RhdGljIHBoeXNf YWRkcl90IHhlbl9maW5kX3B0X2Jhc2UocG1kX3QgKnBtZCkKK3sKKwlwaHlzX2FkZHJfdCBwdF9i YXNlLCBwYWRkcjsKKwl1bnNpZ25lZCBwbWRpZHg7CisKKwlwdF9iYXNlID0gbWluKF9fcGEoeGVu X3N0YXJ0X2luZm8tPnB0X2Jhc2UpLCBfX3BhKHBtZCkpOworCisJZm9yIChwbWRpZHggPSAwOyBw bWRpZHggPCBQVFJTX1BFUl9QTUQ7IHBtZGlkeCsrKQorCQlpZiAocG1kX3ByZXNlbnQocG1kW3Bt ZGlkeF0pICYmICFwbWRfbGFyZ2UocG1kW3BtZGlkeF0pKSB7CisJCQlwYWRkciA9IG0ycChwbWRb cG1kaWR4XS5wbWQpOworCQkJcHRfYmFzZSA9IG1pbihwdF9iYXNlLCBwYWRkcik7CisJCX0KKwor CXJldHVybiBwdF9iYXNlOworfQorCit2b2lkIF9faW5pdCB4ZW5fc2V0dXBfa2VybmVsX3BhZ2V0 YWJsZShwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIG1heF9wZm4pCit7CisJcG1kX3QgKmtlcm5l bF9wbWQ7CisKKwlrZXJuZWxfcG1kID0gbTJ2KHBnZFtLRVJORUxfUEdEX0JPVU5EQVJZXS5wZ2Qp OworCisJeGVuX3B0X2Jhc2UgPSB4ZW5fZmluZF9wdF9iYXNlKGtlcm5lbF9wbWQpOworCXhlbl9w dF9zaXplID0geGVuX3N0YXJ0X2luZm8tPm5yX3B0X2ZyYW1lcyAqIFBBR0VfU0laRTsKKworCWlu aXRpYWxfa2VybmVsX3BtZCA9CisJCWV4dGVuZF9icmsoc2l6ZW9mKHBtZF90KSAqIFBUUlNfUEVS X1BNRCwgUEFHRV9TSVpFKTsKKworCW1heF9wZm5fbWFwcGVkID0gUEZOX0RPV04oeGVuX3B0X2Jh c2UgKyB4ZW5fcHRfc2l6ZSArIDUxMiAqIDEwMjQpOworCisJY29weV9wYWdlKGluaXRpYWxfa2Vy bmVsX3BtZCwga2VybmVsX3BtZCk7CisKKwl4ZW5fbWFwX2lkZW50aXR5X2Vhcmx5KGluaXRpYWxf a2VybmVsX3BtZCwgbWF4X3Bmbik7CisKKwljb3B5X3BhZ2UoaW5pdGlhbF9wYWdlX3RhYmxlLCBw Z2QpOworCWluaXRpYWxfcGFnZV90YWJsZVtLRVJORUxfUEdEX0JPVU5EQVJZXSA9CisJCV9fcGdk KF9fcGEoaW5pdGlhbF9rZXJuZWxfcG1kKSB8IF9QQUdFX1BSRVNFTlQpOworCisJc2V0X3BhZ2Vf cHJvdChpbml0aWFsX2tlcm5lbF9wbWQsIFBBR0VfS0VSTkVMX1JPKTsKKwlzZXRfcGFnZV9wcm90 KGluaXRpYWxfcGFnZV90YWJsZSwgUEFHRV9LRVJORUxfUk8pOworCXNldF9wYWdlX3Byb3QoZW1w dHlfemVyb19wYWdlLCBQQUdFX0tFUk5FTF9STyk7CisKKwlwaW5fcGFnZXRhYmxlX3BmbihNTVVF WFRfVU5QSU5fVEFCTEUsIFBGTl9ET1dOKF9fcGEocGdkKSkpOworCisJcGluX3BhZ2V0YWJsZV9w Zm4oTU1VRVhUX1BJTl9MM19UQUJMRSwKKwkJCSAgUEZOX0RPV04oX19wYShpbml0aWFsX3BhZ2Vf dGFibGUpKSk7CisJeGVuX3dyaXRlX2NyMyhfX3BhKGluaXRpYWxfcGFnZV90YWJsZSkpOworCisJ bWVtYmxvY2tfcmVzZXJ2ZSh4ZW5fcHRfYmFzZSwgeGVuX3B0X3NpemUpOworfQorI2VuZGlmCS8q IENPTkZJR19YODZfNjQgKi8KKwordm9pZCBfX2luaXQgeGVuX3Jlc2VydmVfc3BlY2lhbF9wYWdl cyh2b2lkKQoreworCXBoeXNfYWRkcl90IHBhZGRyOworCisJbWVtYmxvY2tfcmVzZXJ2ZShfX3Bh KHhlbl9zdGFydF9pbmZvKSwgUEFHRV9TSVpFKTsKKwlpZiAoeGVuX3N0YXJ0X2luZm8tPnN0b3Jl X21mbikgeworCQlwYWRkciA9IFBGTl9QSFlTKG1mbl90b19wZm4oeGVuX3N0YXJ0X2luZm8tPnN0 b3JlX21mbikpOworCQltZW1ibG9ja19yZXNlcnZlKHBhZGRyLCBQQUdFX1NJWkUpOworCX0KKwlp ZiAoIXhlbl9pbml0aWFsX2RvbWFpbigpKSB7CisJCXBhZGRyID0gUEZOX1BIWVMobWZuX3RvX3Bm bih4ZW5fc3RhcnRfaW5mby0+Y29uc29sZS5kb21VLm1mbikpOworCQltZW1ibG9ja19yZXNlcnZl KHBhZGRyLCBQQUdFX1NJWkUpOworCX0KK30KKwordm9pZCBfX2luaXQgeGVuX3B0X2NoZWNrX2U4 MjAodm9pZCkKK3sKKwlpZiAoeGVuX2lzX2U4MjBfcmVzZXJ2ZWQoeGVuX3B0X2Jhc2UsIHhlbl9w dF9zaXplKSkgeworCQl4ZW5fcmF3X2NvbnNvbGVfd3JpdGUoIlhlbiBoeXBlcnZpc29yIGFsbG9j YXRlZCBwYWdlIHRhYmxlIG1lbW9yeSBjb25mbGljdHMgd2l0aCBFODIwIG1hcFxuIik7CisJCUJV RygpOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZHVtbXlfbWFwcGluZ1tQQUdFX1NJ WkVdIF9fcGFnZV9hbGlnbmVkX2JzczsKKworc3RhdGljIHZvaWQgeGVuX3NldF9maXhtYXAodW5z aWduZWQgaWR4LCBwaHlzX2FkZHJfdCBwaHlzLCBwZ3Byb3RfdCBwcm90KQoreworCXB0ZV90IHB0 ZTsKKworCXBoeXMgPj49IFBBR0VfU0hJRlQ7CisKKwlzd2l0Y2ggKGlkeCkgeworCWNhc2UgRklY X0JUTUFQX0VORCAuLi4gRklYX0JUTUFQX0JFR0lOOgorCWNhc2UgRklYX1JPX0lEVDoKKyNpZmRl ZiBDT05GSUdfWDg2XzMyCisJY2FzZSBGSVhfV1BfVEVTVDoKKyMgaWZkZWYgQ09ORklHX0hJR0hN RU0KKwljYXNlIEZJWF9LTUFQX0JFR0lOIC4uLiBGSVhfS01BUF9FTkQ6CisjIGVuZGlmCisjZWxp ZiBkZWZpbmVkKENPTkZJR19YODZfVlNZU0NBTExfRU1VTEFUSU9OKQorCWNhc2UgVlNZU0NBTExf UEFHRToKKyNlbmRpZgorCWNhc2UgRklYX1RFWFRfUE9LRTA6CisJY2FzZSBGSVhfVEVYVF9QT0tF MToKKwkJLyogQWxsIGxvY2FsIHBhZ2UgbWFwcGluZ3MgKi8KKwkJcHRlID0gcGZuX3B0ZShwaHlz LCBwcm90KTsKKwkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKwljYXNl IEZJWF9BUElDX0JBU0U6CS8qIG1hcHMgZHVtbXkgbG9jYWwgQVBJQyAqLworCQlwdGUgPSBwZm5f cHRlKFBGTl9ET1dOKF9fcGEoZHVtbXlfbWFwcGluZykpLCBQQUdFX0tFUk5FTCk7CisJCWJyZWFr OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKKwljYXNlIEZJWF9JT19BUElD X0JBU0VfMCAuLi4gRklYX0lPX0FQSUNfQkFTRV9FTkQ6CisJCS8qCisJCSAqIFdlIGp1c3QgZG9u J3QgbWFwIHRoZSBJTyBBUElDIC0gYWxsIGFjY2VzcyBpcyB2aWEKKwkJICogaHlwZXJjYWxscy4g IEtlZXAgdGhlIGFkZHJlc3MgaW4gdGhlIHB0ZSBmb3IgcmVmZXJlbmNlLgorCQkgKi8KKwkJcHRl ID0gcGZuX3B0ZShQRk5fRE9XTihfX3BhKGR1bW15X21hcHBpbmcpKSwgUEFHRV9LRVJORUwpOwor CQlicmVhazsKKyNlbmRpZgorCisJY2FzZSBGSVhfUEFSQVZJUlRfQk9PVE1BUDoKKwkJLyogVGhp cyBpcyBhbiBNRk4sIGJ1dCBpdCBpc24ndCBhbiBJTyBtYXBwaW5nIGZyb20gdGhlCisJCSAgIElP IGRvbWFpbiAqLworCQlwdGUgPSBtZm5fcHRlKHBoeXMsIHByb3QpOworCQlicmVhazsKKworCWRl ZmF1bHQ6CisJCS8qIEJ5IGRlZmF1bHQsIHNldF9maXhtYXAgaXMgdXNlZCBmb3IgaGFyZHdhcmUg bWFwcGluZ3MgKi8KKwkJcHRlID0gbWZuX3B0ZShwaHlzLCBwcm90KTsKKwkJYnJlYWs7CisJfQor CisJX19uYXRpdmVfc2V0X2ZpeG1hcChpZHgsIHB0ZSk7CisKKyNpZmRlZiBDT05GSUdfWDg2X1ZT WVNDQUxMX0VNVUxBVElPTgorCS8qIFJlcGxpY2F0ZSBjaGFuZ2VzIHRvIG1hcCB0aGUgdnN5c2Nh bGwgcGFnZSBpbnRvIHRoZSB1c2VyCisJICAgcGFnZXRhYmxlIHZzeXNjYWxsIG1hcHBpbmcuICov CisJaWYgKGlkeCA9PSBWU1lTQ0FMTF9QQUdFKSB7CisJCXVuc2lnbmVkIGxvbmcgdmFkZHIgPSBf X2ZpeF90b192aXJ0KGlkeCk7CisJCXNldF9wdGVfdmFkZHJfcHVkKGxldmVsM191c2VyX3ZzeXNj YWxsLCB2YWRkciwgcHRlKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgX19pbml0IHhl bl9wb3N0X2FsbG9jYXRvcl9pbml0KHZvaWQpCit7CisJaWYgKHhlbl9mZWF0dXJlKFhFTkZFQVRf YXV0b190cmFuc2xhdGVkX3BoeXNtYXApKQorCQlyZXR1cm47CisKKwlwdl9tbXVfb3BzLnNldF9w dGUgPSB4ZW5fc2V0X3B0ZTsKKwlwdl9tbXVfb3BzLnNldF9wbWQgPSB4ZW5fc2V0X3BtZDsKKwlw dl9tbXVfb3BzLnNldF9wdWQgPSB4ZW5fc2V0X3B1ZDsKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZF TFMgPT0gNAorCXB2X21tdV9vcHMuc2V0X3BnZCA9IHhlbl9zZXRfcGdkOworI2VuZGlmCisKKwkv KiBUaGlzIHdpbGwgd29yayBhcyBsb25nIGFzIHBhdGNoaW5nIGhhc24ndCBoYXBwZW5lZCB5ZXQK KwkgICAod2hpY2ggaXQgaGFzbid0KSAqLworCXB2X21tdV9vcHMuYWxsb2NfcHRlID0geGVuX2Fs bG9jX3B0ZTsKKwlwdl9tbXVfb3BzLmFsbG9jX3BtZCA9IHhlbl9hbGxvY19wbWQ7CisJcHZfbW11 X29wcy5yZWxlYXNlX3B0ZSA9IHhlbl9yZWxlYXNlX3B0ZTsKKwlwdl9tbXVfb3BzLnJlbGVhc2Vf cG1kID0geGVuX3JlbGVhc2VfcG1kOworI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSA0CisJ cHZfbW11X29wcy5hbGxvY19wdWQgPSB4ZW5fYWxsb2NfcHVkOworCXB2X21tdV9vcHMucmVsZWFz ZV9wdWQgPSB4ZW5fcmVsZWFzZV9wdWQ7CisjZW5kaWYKKwlwdl9tbXVfb3BzLm1ha2VfcHRlID0g UFZfQ0FMTEVFX1NBVkUoeGVuX21ha2VfcHRlKTsKKworI2lmZGVmIENPTkZJR19YODZfNjQKKwlw dl9tbXVfb3BzLndyaXRlX2NyMyA9ICZ4ZW5fd3JpdGVfY3IzOworCVNldFBhZ2VQaW5uZWQodmly dF90b19wYWdlKGxldmVsM191c2VyX3ZzeXNjYWxsKSk7CisjZW5kaWYKKwl4ZW5fbWFya19pbml0 X21tX3Bpbm5lZCgpOworfQorCitzdGF0aWMgdm9pZCB4ZW5fbGVhdmVfbGF6eV9tbXUodm9pZCkK K3sKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwl4ZW5fbWNfZmx1c2goKTsKKwlwYXJhdmlydF9sZWF2 ZV9sYXp5X21tdSgpOworCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgcHZfbW11X29wcyB4ZW5fbW11X29wcyBfX2luaXRjb25zdCA9IHsKKwkucmVhZF9jcjIgPSB4 ZW5fcmVhZF9jcjIsCisJLndyaXRlX2NyMiA9IHhlbl93cml0ZV9jcjIsCisKKwkucmVhZF9jcjMg PSB4ZW5fcmVhZF9jcjMsCisJLndyaXRlX2NyMyA9IHhlbl93cml0ZV9jcjNfaW5pdCwKKworCS5m bHVzaF90bGJfdXNlciA9IHhlbl9mbHVzaF90bGIsCisJLmZsdXNoX3RsYl9rZXJuZWwgPSB4ZW5f Zmx1c2hfdGxiLAorCS5mbHVzaF90bGJfc2luZ2xlID0geGVuX2ZsdXNoX3RsYl9zaW5nbGUsCisJ LmZsdXNoX3RsYl9vdGhlcnMgPSB4ZW5fZmx1c2hfdGxiX290aGVycywKKworCS5wdGVfdXBkYXRl ID0gcGFyYXZpcnRfbm9wLAorCisJLnBnZF9hbGxvYyA9IHhlbl9wZ2RfYWxsb2MsCisJLnBnZF9m cmVlID0geGVuX3BnZF9mcmVlLAorCisJLmFsbG9jX3B0ZSA9IHhlbl9hbGxvY19wdGVfaW5pdCwK KwkucmVsZWFzZV9wdGUgPSB4ZW5fcmVsZWFzZV9wdGVfaW5pdCwKKwkuYWxsb2NfcG1kID0geGVu X2FsbG9jX3BtZF9pbml0LAorCS5yZWxlYXNlX3BtZCA9IHhlbl9yZWxlYXNlX3BtZF9pbml0LAor CisJLnNldF9wdGUgPSB4ZW5fc2V0X3B0ZV9pbml0LAorCS5zZXRfcHRlX2F0ID0geGVuX3NldF9w dGVfYXQsCisJLnNldF9wbWQgPSB4ZW5fc2V0X3BtZF9oeXBlciwKKworCS5wdGVwX21vZGlmeV9w cm90X3N0YXJ0ID0gX19wdGVwX21vZGlmeV9wcm90X3N0YXJ0LAorCS5wdGVwX21vZGlmeV9wcm90 X2NvbW1pdCA9IF9fcHRlcF9tb2RpZnlfcHJvdF9jb21taXQsCisKKwkucHRlX3ZhbCA9IFBWX0NB TExFRV9TQVZFKHhlbl9wdGVfdmFsKSwKKwkucGdkX3ZhbCA9IFBWX0NBTExFRV9TQVZFKHhlbl9w Z2RfdmFsKSwKKworCS5tYWtlX3B0ZSA9IFBWX0NBTExFRV9TQVZFKHhlbl9tYWtlX3B0ZV9pbml0 KSwKKwkubWFrZV9wZ2QgPSBQVl9DQUxMRUVfU0FWRSh4ZW5fbWFrZV9wZ2QpLAorCisjaWZkZWYg Q09ORklHX1g4Nl9QQUUKKwkuc2V0X3B0ZV9hdG9taWMgPSB4ZW5fc2V0X3B0ZV9hdG9taWMsCisJ LnB0ZV9jbGVhciA9IHhlbl9wdGVfY2xlYXIsCisJLnBtZF9jbGVhciA9IHhlbl9wbWRfY2xlYXIs CisjZW5kaWYJLyogQ09ORklHX1g4Nl9QQUUgKi8KKwkuc2V0X3B1ZCA9IHhlbl9zZXRfcHVkX2h5 cGVyLAorCisJLm1ha2VfcG1kID0gUFZfQ0FMTEVFX1NBVkUoeGVuX21ha2VfcG1kKSwKKwkucG1k X3ZhbCA9IFBWX0NBTExFRV9TQVZFKHhlbl9wbWRfdmFsKSwKKworI2lmIENPTkZJR19QR1RBQkxF X0xFVkVMUyA9PSA0CisJLnB1ZF92YWwgPSBQVl9DQUxMRUVfU0FWRSh4ZW5fcHVkX3ZhbCksCisJ Lm1ha2VfcHVkID0gUFZfQ0FMTEVFX1NBVkUoeGVuX21ha2VfcHVkKSwKKwkuc2V0X3BnZCA9IHhl bl9zZXRfcGdkX2h5cGVyLAorCisJLmFsbG9jX3B1ZCA9IHhlbl9hbGxvY19wbWRfaW5pdCwKKwku cmVsZWFzZV9wdWQgPSB4ZW5fcmVsZWFzZV9wbWRfaW5pdCwKKyNlbmRpZgkvKiBDT05GSUdfUEdU QUJMRV9MRVZFTFMgPT0gNCAqLworCisJLmFjdGl2YXRlX21tID0geGVuX2FjdGl2YXRlX21tLAor CS5kdXBfbW1hcCA9IHhlbl9kdXBfbW1hcCwKKwkuZXhpdF9tbWFwID0geGVuX2V4aXRfbW1hcCwK KworCS5sYXp5X21vZGUgPSB7CisJCS5lbnRlciA9IHBhcmF2aXJ0X2VudGVyX2xhenlfbW11LAor CQkubGVhdmUgPSB4ZW5fbGVhdmVfbGF6eV9tbXUsCisJCS5mbHVzaCA9IHBhcmF2aXJ0X2ZsdXNo X2xhenlfbW11LAorCX0sCisKKwkuc2V0X2ZpeG1hcCA9IHhlbl9zZXRfZml4bWFwLAorfTsKKwor dm9pZCBfX2luaXQgeGVuX2luaXRfbW11X29wcyh2b2lkKQoreworCXg4Nl9pbml0LnBhZ2luZy5w YWdldGFibGVfaW5pdCA9IHhlbl9wYWdldGFibGVfaW5pdDsKKworCWlmICh4ZW5fZmVhdHVyZShY RU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSkKKwkJcmV0dXJuOworCisJcHZfbW11X29w cyA9IHhlbl9tbXVfb3BzOworCisJbWVtc2V0KGR1bW15X21hcHBpbmcsIDB4ZmYsIFBBR0VfU0la RSk7Cit9CisKKy8qIFByb3RlY3RlZCBieSB4ZW5fcmVzZXJ2YXRpb25fbG9jay4gKi8KKyNkZWZp bmUgTUFYX0NPTlRJR19PUkRFUiA5IC8qIDJNQiAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZGlz Y29udGlnX2ZyYW1lc1sxPDxNQVhfQ09OVElHX09SREVSXTsKKworI2RlZmluZSBWT0lEX1BURSAo bWZuX3B0ZSgwLCBfX3BncHJvdCgwKSkpCitzdGF0aWMgdm9pZCB4ZW5femFwX3Bmbl9yYW5nZSh1 bnNpZ25lZCBsb25nIHZhZGRyLCB1bnNpZ25lZCBpbnQgb3JkZXIsCisJCQkJdW5zaWduZWQgbG9u ZyAqaW5fZnJhbWVzLAorCQkJCXVuc2lnbmVkIGxvbmcgKm91dF9mcmFtZXMpCit7CisJaW50IGk7 CisJc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7CisKKwl4ZW5fbWNfYmF0Y2goKTsKKwlmb3Ig KGkgPSAwOyBpIDwgKDFVTDw8b3JkZXIpOyBpKyssIHZhZGRyICs9IFBBR0VfU0laRSkgeworCQlt Y3MgPSBfX3hlbl9tY19lbnRyeSgwKTsKKworCQlpZiAoaW5fZnJhbWVzKQorCQkJaW5fZnJhbWVz W2ldID0gdmlydF90b19tZm4odmFkZHIpOworCisJCU1VTFRJX3VwZGF0ZV92YV9tYXBwaW5nKG1j cy5tYywgdmFkZHIsIFZPSURfUFRFLCAwKTsKKwkJX19zZXRfcGh5c190b19tYWNoaW5lKHZpcnRf dG9fcGZuKHZhZGRyKSwgSU5WQUxJRF9QMk1fRU5UUlkpOworCisJCWlmIChvdXRfZnJhbWVzKQor CQkJb3V0X2ZyYW1lc1tpXSA9IHZpcnRfdG9fcGZuKHZhZGRyKTsKKwl9CisJeGVuX21jX2lzc3Vl KDApOworfQorCisvKgorICogVXBkYXRlIHRoZSBwZm4tdG8tbWZuIG1hcHBpbmdzIGZvciBhIHZp cnR1YWwgYWRkcmVzcyByYW5nZSwgZWl0aGVyIHRvCisgKiBwb2ludCB0byBhbiBhcnJheSBvZiBt Zm5zLCBvciBjb250aWd1b3VzbHkgZnJvbSBhIHNpbmdsZSBzdGFydGluZworICogbWZuLgorICov CitzdGF0aWMgdm9pZCB4ZW5fcmVtYXBfZXhjaGFuZ2VkX3B0ZXModW5zaWduZWQgbG9uZyB2YWRk ciwgaW50IG9yZGVyLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqbWZucywKKwkJCQkgICAgIHVu c2lnbmVkIGxvbmcgZmlyc3RfbWZuKQoreworCXVuc2lnbmVkIGksIGxpbWl0OworCXVuc2lnbmVk IGxvbmcgbWZuOworCisJeGVuX21jX2JhdGNoKCk7CisKKwlsaW1pdCA9IDF1IDw8IG9yZGVyOwor CWZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSsrLCB2YWRkciArPSBQQUdFX1NJWkUpIHsKKwkJc3Ry dWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7CisJCXVuc2lnbmVkIGZsYWdzOworCisJCW1jcyA9IF9f eGVuX21jX2VudHJ5KDApOworCQlpZiAobWZucykKKwkJCW1mbiA9IG1mbnNbaV07CisJCWVsc2UK KwkJCW1mbiA9IGZpcnN0X21mbiArIGk7CisKKwkJaWYgKGkgPCAobGltaXQgLSAxKSkKKwkJCWZs YWdzID0gMDsKKwkJZWxzZSB7CisJCQlpZiAob3JkZXIgPT0gMCkKKwkJCQlmbGFncyA9IFVWTUZf SU5WTFBHIHwgVVZNRl9BTEw7CisJCQllbHNlCisJCQkJZmxhZ3MgPSBVVk1GX1RMQl9GTFVTSCB8 IFVWTUZfQUxMOworCQl9CisKKwkJTVVMVElfdXBkYXRlX3ZhX21hcHBpbmcobWNzLm1jLCB2YWRk ciwKKwkJCQltZm5fcHRlKG1mbiwgUEFHRV9LRVJORUwpLCBmbGFncyk7CisKKwkJc2V0X3BoeXNf dG9fbWFjaGluZSh2aXJ0X3RvX3Bmbih2YWRkciksIG1mbik7CisJfQorCisJeGVuX21jX2lzc3Vl KDApOworfQorCisvKgorICogUGVyZm9ybSB0aGUgaHlwZXJjYWxsIHRvIGV4Y2hhbmdlIGEgcmVn aW9uIG9mIG91ciBwZm5zIHRvIHBvaW50IHRvCisgKiBtZW1vcnkgd2l0aCB0aGUgcmVxdWlyZWQg Y29udGlndW91cyBhbGlnbm1lbnQuICBUYWtlcyB0aGUgcGZucyBhcworICogaW5wdXQsIGFuZCBw b3B1bGF0ZXMgbWZucyBhcyBvdXRwdXQuCisgKgorICogUmV0dXJucyBhIHN1Y2Nlc3MgY29kZSBp bmRpY2F0aW5nIHdoZXRoZXIgdGhlIGh5cGVydmlzb3Igd2FzIGFibGUgdG8KKyAqIHNhdGlzZnkg dGhlIHJlcXVlc3Qgb3Igbm90LgorICovCitzdGF0aWMgaW50IHhlbl9leGNoYW5nZV9tZW1vcnko dW5zaWduZWQgbG9uZyBleHRlbnRzX2luLCB1bnNpZ25lZCBpbnQgb3JkZXJfaW4sCisJCQkgICAg ICAgdW5zaWduZWQgbG9uZyAqcGZuc19pbiwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGV4dGVu dHNfb3V0LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBvcmRlcl9vdXQsCisJCQkgICAgICAgdW5z aWduZWQgbG9uZyAqbWZuc19vdXQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGFkZHJlc3NfYml0 cykKK3sKKwlsb25nIHJjOworCWludCBzdWNjZXNzOworCisJc3RydWN0IHhlbl9tZW1vcnlfZXhj aGFuZ2UgZXhjaGFuZ2UgPSB7CisJCS5pbiA9IHsKKwkJCS5ucl9leHRlbnRzICAgPSBleHRlbnRz X2luLAorCQkJLmV4dGVudF9vcmRlciA9IG9yZGVyX2luLAorCQkJLmV4dGVudF9zdGFydCA9IHBm bnNfaW4sCisJCQkuZG9taWQgICAgICAgID0gRE9NSURfU0VMRgorCQl9LAorCQkub3V0ID0gewor CQkJLm5yX2V4dGVudHMgICA9IGV4dGVudHNfb3V0LAorCQkJLmV4dGVudF9vcmRlciA9IG9yZGVy X291dCwKKwkJCS5leHRlbnRfc3RhcnQgPSBtZm5zX291dCwKKwkJCS5hZGRyZXNzX2JpdHMgPSBh ZGRyZXNzX2JpdHMsCisJCQkuZG9taWQgICAgICAgID0gRE9NSURfU0VMRgorCQl9CisJfTsKKwor CUJVR19PTihleHRlbnRzX2luIDw8IG9yZGVyX2luICE9IGV4dGVudHNfb3V0IDw8IG9yZGVyX291 dCk7CisKKwlyYyA9IEhZUEVSVklTT1JfbWVtb3J5X29wKFhFTk1FTV9leGNoYW5nZSwgJmV4Y2hh bmdlKTsKKwlzdWNjZXNzID0gKGV4Y2hhbmdlLm5yX2V4Y2hhbmdlZCA9PSBleHRlbnRzX2luKTsK KworCUJVR19PTighc3VjY2VzcyAmJiAoKGV4Y2hhbmdlLm5yX2V4Y2hhbmdlZCAhPSAwKSB8fCAo cmMgPT0gMCkpKTsKKwlCVUdfT04oc3VjY2VzcyAmJiAocmMgIT0gMCkpOworCisJcmV0dXJuIHN1 Y2Nlc3M7Cit9CisKK2ludCB4ZW5fY3JlYXRlX2NvbnRpZ3VvdXNfcmVnaW9uKHBoeXNfYWRkcl90 IHBzdGFydCwgdW5zaWduZWQgaW50IG9yZGVyLAorCQkJCSB1bnNpZ25lZCBpbnQgYWRkcmVzc19i aXRzLAorCQkJCSBkbWFfYWRkcl90ICpkbWFfaGFuZGxlKQoreworCXVuc2lnbmVkIGxvbmcgKmlu X2ZyYW1lcyA9IGRpc2NvbnRpZ19mcmFtZXMsIG91dF9mcmFtZTsKKwl1bnNpZ25lZCBsb25nICBm bGFnczsKKwlpbnQgICAgICAgICAgICBzdWNjZXNzOworCXVuc2lnbmVkIGxvbmcgdnN0YXJ0ID0g KHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHBzdGFydCk7CisKKwkvKgorCSAqIEN1cnJlbnRs eSBhbiBhdXRvLXRyYW5zbGF0ZWQgZ3Vlc3Qgd2lsbCBub3QgcGVyZm9ybSBJL08sIG5vciB3aWxs CisJICogaXQgcmVxdWlyZSBQQUUgcGFnZSBkaXJlY3RvcmllcyBiZWxvdyA0R0IuIFRoZXJlZm9y ZSBhbnkgY2FsbHMgdG8KKwkgKiB0aGlzIGZ1bmN0aW9uIGFyZSByZWR1bmRhbnQgYW5kIGNhbiBi ZSBpZ25vcmVkLgorCSAqLworCisJaWYgKHhlbl9mZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xh dGVkX3BoeXNtYXApKQorCQlyZXR1cm4gMDsKKworCWlmICh1bmxpa2VseShvcmRlciA+IE1BWF9D T05USUdfT1JERVIpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldCgodm9pZCAqKSB2c3Rh cnQsIDAsIFBBR0VfU0laRSA8PCBvcmRlcik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeGVuX3Jl c2VydmF0aW9uX2xvY2ssIGZsYWdzKTsKKworCS8qIDEuIFphcCBjdXJyZW50IFBURXMsIHJlbWVt YmVyaW5nIE1GTnMuICovCisJeGVuX3phcF9wZm5fcmFuZ2UodnN0YXJ0LCBvcmRlciwgaW5fZnJh bWVzLCBOVUxMKTsKKworCS8qIDIuIEdldCBhIG5ldyBjb250aWd1b3VzIG1lbW9yeSBleHRlbnQu ICovCisJb3V0X2ZyYW1lID0gdmlydF90b19wZm4odnN0YXJ0KTsKKwlzdWNjZXNzID0geGVuX2V4 Y2hhbmdlX21lbW9yeSgxVUwgPDwgb3JkZXIsIDAsIGluX2ZyYW1lcywKKwkJCQkgICAgICAxLCBv cmRlciwgJm91dF9mcmFtZSwKKwkJCQkgICAgICBhZGRyZXNzX2JpdHMpOworCisJLyogMy4gTWFw IHRoZSBuZXcgZXh0ZW50IGluIHBsYWNlIG9mIG9sZCBwYWdlcy4gKi8KKwlpZiAoc3VjY2VzcykK KwkJeGVuX3JlbWFwX2V4Y2hhbmdlZF9wdGVzKHZzdGFydCwgb3JkZXIsIE5VTEwsIG91dF9mcmFt ZSk7CisJZWxzZQorCQl4ZW5fcmVtYXBfZXhjaGFuZ2VkX3B0ZXModnN0YXJ0LCBvcmRlciwgaW5f ZnJhbWVzLCAwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhlbl9yZXNlcnZhdGlvbl9s b2NrLCBmbGFncyk7CisKKwkqZG1hX2hhbmRsZSA9IHZpcnRfdG9fbWFjaGluZSh2c3RhcnQpLm1h ZGRyOworCXJldHVybiBzdWNjZXNzID8gMCA6IC1FTk9NRU07Cit9CitFWFBPUlRfU1lNQk9MX0dQ TCh4ZW5fY3JlYXRlX2NvbnRpZ3VvdXNfcmVnaW9uKTsKKwordm9pZCB4ZW5fZGVzdHJveV9jb250 aWd1b3VzX3JlZ2lvbihwaHlzX2FkZHJfdCBwc3RhcnQsIHVuc2lnbmVkIGludCBvcmRlcikKK3sK Kwl1bnNpZ25lZCBsb25nICpvdXRfZnJhbWVzID0gZGlzY29udGlnX2ZyYW1lcywgaW5fZnJhbWU7 CisJdW5zaWduZWQgbG9uZyAgZmxhZ3M7CisJaW50IHN1Y2Nlc3M7CisJdW5zaWduZWQgbG9uZyB2 c3RhcnQ7CisKKwlpZiAoeGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21h cCkpCisJCXJldHVybjsKKworCWlmICh1bmxpa2VseShvcmRlciA+IE1BWF9DT05USUdfT1JERVIp KQorCQlyZXR1cm47CisKKwl2c3RhcnQgPSAodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQocHN0 YXJ0KTsKKwltZW1zZXQoKHZvaWQgKikgdnN0YXJ0LCAwLCBQQUdFX1NJWkUgPDwgb3JkZXIpOwor CisJc3Bpbl9sb2NrX2lycXNhdmUoJnhlbl9yZXNlcnZhdGlvbl9sb2NrLCBmbGFncyk7CisKKwkv KiAxLiBGaW5kIHN0YXJ0IE1GTiBvZiBjb250aWd1b3VzIGV4dGVudC4gKi8KKwlpbl9mcmFtZSA9 IHZpcnRfdG9fbWZuKHZzdGFydCk7CisKKwkvKiAyLiBaYXAgY3VycmVudCBQVEVzLiAqLworCXhl bl96YXBfcGZuX3JhbmdlKHZzdGFydCwgb3JkZXIsIE5VTEwsIG91dF9mcmFtZXMpOworCisJLyog My4gRG8gdGhlIGV4Y2hhbmdlIGZvciBub24tY29udGlndW91cyBNRk5zLiAqLworCXN1Y2Nlc3Mg PSB4ZW5fZXhjaGFuZ2VfbWVtb3J5KDEsIG9yZGVyLCAmaW5fZnJhbWUsIDFVTCA8PCBvcmRlciwK KwkJCQkJMCwgb3V0X2ZyYW1lcywgMCk7CisKKwkvKiA0LiBNYXAgbmV3IHBhZ2VzIGluIHBsYWNl IG9mIG9sZCBwYWdlcy4gKi8KKwlpZiAoc3VjY2VzcykKKwkJeGVuX3JlbWFwX2V4Y2hhbmdlZF9w dGVzKHZzdGFydCwgb3JkZXIsIG91dF9mcmFtZXMsIDApOworCWVsc2UKKwkJeGVuX3JlbWFwX2V4 Y2hhbmdlZF9wdGVzKHZzdGFydCwgb3JkZXIsIE5VTEwsIGluX2ZyYW1lKTsKKworCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJnhlbl9yZXNlcnZhdGlvbl9sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRf U1lNQk9MX0dQTCh4ZW5fZGVzdHJveV9jb250aWd1b3VzX3JlZ2lvbik7CmRpZmYgLS1naXQgYS9k cml2ZXJzL3hlbi9iYWxsb29uLmMgYi9kcml2ZXJzL3hlbi9iYWxsb29uLmMKaW5kZXggZGIxMDdm YS4uYjExY2E3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vYmFsbG9vbi5jCisrKyBiL2RyaXZl cnMveGVuL2JhbGxvb24uYwpAQCAtNzA4LDYgKzcwOCw3IEBAIHZvaWQgZnJlZV94ZW5iYWxsb29u ZWRfcGFnZXMoaW50IG5yX3BhZ2VzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQogfQogRVhQT1JUX1NZ TUJPTChmcmVlX3hlbmJhbGxvb25lZF9wYWdlcyk7CiAKKyNpZmRlZiBDT05GSUdfWEVOX1BWCiBz dGF0aWMgdm9pZCBfX2luaXQgYmFsbG9vbl9hZGRfcmVnaW9uKHVuc2lnbmVkIGxvbmcgc3RhcnRf cGZuLAogCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcGFnZXMpCiB7CkBAIC03MzEsMTkgKzczMiwy MiBAQCBzdGF0aWMgdm9pZCBfX2luaXQgYmFsbG9vbl9hZGRfcmVnaW9uKHVuc2lnbmVkIGxvbmcg c3RhcnRfcGZuLAogCiAJYmFsbG9vbl9zdGF0cy50b3RhbF9wYWdlcyArPSBleHRyYV9wZm5fZW5k IC0gc3RhcnRfcGZuOwogfQorI2VuZGlmCiAKIHN0YXRpYyBpbnQgX19pbml0IGJhbGxvb25faW5p dCh2b2lkKQogewotCWludCBpOwotCiAJaWYgKCF4ZW5fZG9tYWluKCkpCiAJCXJldHVybiAtRU5P REVWOwogCiAJcHJfaW5mbygiSW5pdGlhbGlzaW5nIGJhbGxvb24gZHJpdmVyXG4iKTsKIAorI2lm ZGVmIENPTkZJR19YRU5fUFYKIAliYWxsb29uX3N0YXRzLmN1cnJlbnRfcGFnZXMgPSB4ZW5fcHZf ZG9tYWluKCkKIAkJPyBtaW4oeGVuX3N0YXJ0X2luZm8tPm5yX3BhZ2VzIC0geGVuX3JlbGVhc2Vk X3BhZ2VzLCBtYXhfcGZuKQogCQk6IGdldF9udW1fcGh5c3BhZ2VzKCk7CisjZWxzZQorCWJhbGxv b25fc3RhdHMuY3VycmVudF9wYWdlcyA9IGdldF9udW1fcGh5c3BhZ2VzKCk7CisjZW5kaWYKIAli YWxsb29uX3N0YXRzLnRhcmdldF9wYWdlcyAgPSBiYWxsb29uX3N0YXRzLmN1cnJlbnRfcGFnZXM7 CiAJYmFsbG9vbl9zdGF0cy5iYWxsb29uX2xvdyAgID0gMDsKIAliYWxsb29uX3N0YXRzLmJhbGxv b25faGlnaCAgPSAwOwpAQCAtNzYwLDE0ICs3NjQsMjAgQEAgc3RhdGljIGludCBfX2luaXQgYmFs bG9vbl9pbml0KHZvaWQpCiAJcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHhlbl9yb290KTsKICNlbmRp ZgogCi0JLyoKLQkgKiBJbml0aWFsaXplIHRoZSBiYWxsb29uIHdpdGggcGFnZXMgZnJvbSB0aGUg ZXh0cmEgbWVtb3J5Ci0JICogcmVnaW9ucyAoc2VlIGFyY2gveDg2L3hlbi9zZXR1cC5jKS4KLQkg Ki8KLQlmb3IgKGkgPSAwOyBpIDwgWEVOX0VYVFJBX01FTV9NQVhfUkVHSU9OUzsgaSsrKQotCQlp ZiAoeGVuX2V4dHJhX21lbVtpXS5uX3BmbnMpCi0JCQliYWxsb29uX2FkZF9yZWdpb24oeGVuX2V4 dHJhX21lbVtpXS5zdGFydF9wZm4sCi0JCQkJCSAgIHhlbl9leHRyYV9tZW1baV0ubl9wZm5zKTsK KyNpZmRlZiBDT05GSUdfWEVOX1BWCisJeworCQlpbnQgaTsKKworCQkvKgorCQkgKiBJbml0aWFs aXplIHRoZSBiYWxsb29uIHdpdGggcGFnZXMgZnJvbSB0aGUgZXh0cmEgbWVtb3J5CisJCSAqIHJl Z2lvbnMgKHNlZSBhcmNoL3g4Ni94ZW4vc2V0dXAuYykuCisJCSAqLworCQlmb3IgKGkgPSAwOyBp IDwgWEVOX0VYVFJBX01FTV9NQVhfUkVHSU9OUzsgaSsrKQorCQkJaWYgKHhlbl9leHRyYV9tZW1b aV0ubl9wZm5zKQorCQkJCWJhbGxvb25fYWRkX3JlZ2lvbih4ZW5fZXh0cmFfbWVtW2ldLnN0YXJ0 X3BmbiwKKwkJCQkJCSAgIHhlbl9leHRyYV9tZW1baV0ubl9wZm5zKTsKKwl9CisjZW5kaWYKIAog CXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS94ZW4veGVuLW9wcy5oIGIvaW5jbHVk ZS94ZW4veGVuLW9wcy5oCmluZGV4IDRlNTYyZGUuLmY5ZTBlMjMgMTAwNjQ0Ci0tLSBhL2luY2x1 ZGUveGVuL3hlbi1vcHMuaAorKysgYi9pbmNsdWRlL3hlbi94ZW4tb3BzLmgKQEAgLTQwLDExICs0 MCwyNCBAQCB2b2lkIHhlbl9yZWJvb3QoaW50IHJlYXNvbik7CiB2b2lkIHhlbl9lbWVyZ2VuY3lf cmVzdGFydCh2b2lkKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgKnhlbl9jb250aWd1b3VzX2Jp dG1hcDsKKyNpZmRlZiBDT05GSUdfWEVOX1BWCiBpbnQgeGVuX2NyZWF0ZV9jb250aWd1b3VzX3Jl Z2lvbihwaHlzX2FkZHJfdCBwc3RhcnQsIHVuc2lnbmVkIGludCBvcmRlciwKIAkJCQl1bnNpZ25l ZCBpbnQgYWRkcmVzc19iaXRzLAogCQkJCWRtYV9hZGRyX3QgKmRtYV9oYW5kbGUpOwogCiB2b2lk IHhlbl9kZXN0cm95X2NvbnRpZ3VvdXNfcmVnaW9uKHBoeXNfYWRkcl90IHBzdGFydCwgdW5zaWdu ZWQgaW50IG9yZGVyKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCB4ZW5fY3JlYXRlX2NvbnRp Z3VvdXNfcmVnaW9uKHBoeXNfYWRkcl90IHBzdGFydCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGlu dCBvcmRlciwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBhZGRyZXNzX2JpdHMsCisJCQkJCSAg ICAgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMg aW5saW5lIHZvaWQgeGVuX2Rlc3Ryb3lfY29udGlndW91c19yZWdpb24ocGh5c19hZGRyX3QgcHN0 YXJ0LAorCQkJCQkJIHVuc2lnbmVkIGludCBvcmRlcikgeyB9CisjZW5kaWYKIAogc3RydWN0IHZt X2FyZWFfc3RydWN0OwogCi0tIAoyLjkuMwoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fClhlbi1kZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3Rz Lnhlbi5vcmcKaHR0cHM6Ly9saXN0cy54ZW4ub3JnL3hlbi1kZXZlbAo=